@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,251 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_index = require('../ui/index.cjs');
3
+ const require_actions = require('./actions.cjs');
4
+ const require_keybindings = require('./keybindings.cjs');
5
+ const require_dialog = require('./components/dialog.cjs');
6
+ const require_file_list = require('./components/file-list.cjs');
7
+ const require_function_bar = require('./components/function-bar.cjs');
8
+ const require_metadata_panel = require('./components/metadata-panel.cjs');
9
+ const require_status_bar = require('./components/status-bar.cjs');
10
+ require('./components/index.cjs');
11
+ const require_state = require('./state.cjs');
12
+ let blessed = require("blessed");
13
+ blessed = require_rolldown_runtime.__toESM(blessed);
14
+
15
+ //#region src/explorer/screen.ts
16
+ /**
17
+ * Create and run the explorer screen
18
+ */
19
+ async function createExplorerScreen(options) {
20
+ const { afs, startPath = "/", version } = options;
21
+ const isRemote = !!(options.input || options.output);
22
+ const store = require_state.createStore(require_actions.createInitialState(startPath));
23
+ const registry = require_keybindings.createDefaultRegistry();
24
+ const screenOpts = {
25
+ smartCSR: true,
26
+ title: "AFS Explorer",
27
+ terminal: options.terminal || "xterm",
28
+ fullUnicode: true,
29
+ warnings: false
30
+ };
31
+ if (options.input) screenOpts.input = options.input;
32
+ if (options.output) screenOpts.output = options.output;
33
+ const screen = blessed.default.screen(screenOpts);
34
+ require_status_bar.createStatusBar(blessed.default, {
35
+ parent: screen,
36
+ store,
37
+ width: "100%",
38
+ top: 0
39
+ });
40
+ const fileList = require_file_list.createFileList(blessed.default, {
41
+ parent: screen,
42
+ store,
43
+ width: "70%",
44
+ height: "100%-2",
45
+ top: 1,
46
+ left: 0
47
+ });
48
+ const metadataPanel = require_metadata_panel.createMetadataPanel(blessed.default, {
49
+ parent: screen,
50
+ width: "30%",
51
+ height: "100%-2",
52
+ top: 1,
53
+ right: 0
54
+ });
55
+ require_function_bar.createFunctionBar(blessed.default, {
56
+ parent: screen,
57
+ registry,
58
+ width: "100%",
59
+ bottom: 0
60
+ });
61
+ const dialogs = require_dialog.createDialogManager(blessed.default, { parent: screen });
62
+ const mountCount = afs.getMounts().length;
63
+ async function loadPath(path) {
64
+ store.setState({
65
+ loading: true,
66
+ error: void 0
67
+ });
68
+ const result = await require_actions.loadDirectory(afs, path);
69
+ store.setState({
70
+ currentPath: path,
71
+ entries: result.entries,
72
+ selectedIndex: 0,
73
+ scrollOffset: 0,
74
+ loading: false,
75
+ error: result.error
76
+ });
77
+ updateMetadata();
78
+ }
79
+ async function updateMetadata() {
80
+ const selected = require_actions.navigation.getSelected(store.getState());
81
+ if (selected) {
82
+ const metadata = await require_actions.loadMetadata(afs, selected);
83
+ metadataPanel.update(selected, metadata);
84
+ } else metadataPanel.clear();
85
+ }
86
+ async function handleEnter() {
87
+ const selected = require_actions.navigation.getSelected(store.getState());
88
+ if (!selected) return;
89
+ if (selected.type === "directory" || selected.type === "up") await loadPath(selected.path);
90
+ else if (selected.type === "file") await handleView();
91
+ }
92
+ async function handleBack() {
93
+ const state = store.getState();
94
+ const parentPath = require_actions.navigation.getParentPath(state.currentPath);
95
+ if (parentPath !== state.currentPath) await loadPath(parentPath);
96
+ }
97
+ async function handleView() {
98
+ const selected = require_actions.navigation.getSelected(store.getState());
99
+ if (!selected || selected.type === "up") return;
100
+ if (selected.type === "file") {
101
+ dialogs.showLoading("Loading file");
102
+ const result = await require_actions.readFileContent(afs, selected.path);
103
+ if (result.error) dialogs.showError("View Error", result.error);
104
+ else dialogs.showFileView(selected.path, result.content);
105
+ } else if (selected.type === "directory") await loadPath(selected.path);
106
+ }
107
+ async function handleExplain() {
108
+ const selected = require_actions.navigation.getSelected(store.getState());
109
+ if (!selected || selected.type === "up") return;
110
+ dialogs.showLoading("Getting explain info");
111
+ const result = await require_actions.getExplain(afs, selected.path);
112
+ if (result.error) dialogs.showError("Explain Error", result.error);
113
+ else dialogs.showExplain(selected.path, result.content);
114
+ }
115
+ async function runAction(item) {
116
+ if (item.inputSchema) dialogs.showParamsInput(item.path, item.inputSchema, async (params) => {
117
+ dialogs.showLoading("Executing action");
118
+ const result = await require_actions.executeAction(afs, item.path, item.name, params);
119
+ dialogs.showActionResult(item.name, result.success, result.message, result.data);
120
+ });
121
+ else {
122
+ dialogs.showLoading("Executing action");
123
+ const result = await require_actions.executeAction(afs, item.path, item.name);
124
+ dialogs.showActionResult(item.name, result.success, result.message, result.data);
125
+ }
126
+ }
127
+ async function handleExec() {
128
+ const selected = require_actions.navigation.getSelected(store.getState());
129
+ if (!selected || selected.type === "up") return;
130
+ const metadata = await require_actions.loadMetadata(afs, selected);
131
+ const actionItems = [];
132
+ const actions = metadata?.actions ?? selected.actions;
133
+ if (actions && actions.length > 0) for (const action of actions) {
134
+ let inputSchema = action.inputSchema;
135
+ if (!inputSchema) try {
136
+ const actionPath = `${selected.path}/.actions/${action.name}`;
137
+ inputSchema = (await afs.stat(actionPath)).data?.meta?.inputSchema;
138
+ } catch {}
139
+ actionItems.push({
140
+ name: action.name,
141
+ path: `${selected.path}/.actions/${action.name}`,
142
+ description: action.description,
143
+ inputSchema
144
+ });
145
+ }
146
+ if (selected.type === "exec") {
147
+ const inputSchema = metadata?.extra?.inputSchema;
148
+ actionItems.push({
149
+ name: "Execute",
150
+ path: selected.path,
151
+ description: "Execute this node directly",
152
+ inputSchema
153
+ });
154
+ }
155
+ if (actionItems.length === 0) {
156
+ dialogs.showError("No Actions", `${selected.name} has no available actions`);
157
+ return;
158
+ }
159
+ if (actionItems.length === 1) {
160
+ await runAction(actionItems[0]);
161
+ return;
162
+ }
163
+ dialogs.showActionPicker(selected.path, actionItems, async (item) => {
164
+ await runAction(item);
165
+ });
166
+ }
167
+ async function handleRefresh() {
168
+ await loadPath(store.getState().currentPath);
169
+ }
170
+ const actionHandlers = {
171
+ help: () => dialogs.showHelp(registry),
172
+ explain: handleExplain,
173
+ view: handleView,
174
+ exec: handleExec,
175
+ refresh: handleRefresh,
176
+ quit: () => {
177
+ dialogs.showConfirm("Are you sure you want to quit?", async () => {
178
+ if (isRemote || options.onExit) {
179
+ screen.destroy();
180
+ options.onExit?.();
181
+ return;
182
+ }
183
+ const logo = require_index.colors.brightCyan("▄▀█ █▀▀ █▀\n█▀█ █▀░ ▄█\n");
184
+ const tagline = require_index.colors.dim("Agentic File System");
185
+ const versionPart = require_index.colors.green(`v${version}`);
186
+ const mountPart = require_index.colors.yellow(`${mountCount} ${mountCount === 1 ? "mount" : "mounts"}`);
187
+ const farewell = `\n${logo}${tagline}\n\n${`${versionPart} ${require_index.colors.dim("•")} ${mountPart}`}\n${require_index.colors.dim("Thanks for using AFS Explorer!")}\n`;
188
+ screen.destroy();
189
+ process.stdout.write(farewell);
190
+ process.exit(0);
191
+ });
192
+ },
193
+ "nav:up": () => {
194
+ store.setState(require_actions.navigation.up(store.getState()));
195
+ updateMetadata();
196
+ },
197
+ "nav:down": () => {
198
+ store.setState(require_actions.navigation.down(store.getState()));
199
+ updateMetadata();
200
+ },
201
+ "nav:enter": handleEnter,
202
+ "nav:back": handleBack,
203
+ "nav:home": () => {
204
+ store.setState(require_actions.navigation.home(store.getState()));
205
+ updateMetadata();
206
+ },
207
+ "nav:end": () => {
208
+ store.setState(require_actions.navigation.end(store.getState()));
209
+ updateMetadata();
210
+ },
211
+ "nav:pageup": () => {
212
+ store.setState(require_actions.navigation.pageUp(store.getState(), fileList.getVisibleHeight()));
213
+ updateMetadata();
214
+ },
215
+ "nav:pagedown": () => {
216
+ store.setState(require_actions.navigation.pageDown(store.getState(), fileList.getVisibleHeight()));
217
+ updateMetadata();
218
+ },
219
+ cancel: () => {
220
+ if (dialogs.isOpen()) dialogs.close();
221
+ else actionHandlers.quit?.();
222
+ }
223
+ };
224
+ screen.on("keypress", async (ch, key) => {
225
+ if (dialogs.isOpen()) return;
226
+ const keyName = key.name || ch;
227
+ if (!keyName) return;
228
+ const binding = registry.getBindingForKey(keyName);
229
+ if (binding) {
230
+ const handler = actionHandlers[binding.action];
231
+ if (handler) {
232
+ await handler();
233
+ screen.render();
234
+ }
235
+ }
236
+ });
237
+ screen.on("resize", () => {
238
+ screen.render();
239
+ });
240
+ fileList.focus();
241
+ await loadPath(startPath);
242
+ screen.render();
243
+ return new Promise((resolve) => {
244
+ screen.on("destroy", () => {
245
+ resolve();
246
+ });
247
+ });
248
+ }
249
+
250
+ //#endregion
251
+ exports.createExplorerScreen = createExplorerScreen;
@@ -0,0 +1,23 @@
1
+ import { AFS } from "@aigne/afs";
2
+
3
+ //#region src/explorer/screen.d.ts
4
+ interface ExplorerScreenOptions {
5
+ afs: AFS;
6
+ startPath?: string;
7
+ version: string;
8
+ /** Custom input stream (for remote/WebSocket sessions). */
9
+ input?: NodeJS.ReadableStream;
10
+ /** Custom output stream (for remote/WebSocket sessions). */
11
+ output?: NodeJS.WritableStream;
12
+ /** Terminal type override. */
13
+ terminal?: string;
14
+ /** Called when the screen is destroyed (instead of process.exit). */
15
+ onExit?: () => void;
16
+ }
17
+ /**
18
+ * Create and run the explorer screen
19
+ */
20
+ declare function createExplorerScreen(options: ExplorerScreenOptions): Promise<void>;
21
+ //#endregion
22
+ export { createExplorerScreen };
23
+ //# sourceMappingURL=screen.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.cts","names":[],"sources":["../../src/explorer/screen.ts"],"mappings":";;;UA6BiB,qBAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA;EACA,OAAA;EAI8B;EAF9B,KAAA,GAAQ,MAAA,CAAO,cAAA;EAJV;EAML,MAAA,GAAS,MAAA,CAAO,cAAA;EAJhB;EAMA,QAAA;EAJQ;EAMR,MAAA;AAAA;;;;iBAMoB,oBAAA,CAAqB,OAAA,EAAS,qBAAA,GAAwB,OAAA"}
@@ -0,0 +1,23 @@
1
+ import { AFS } from "@aigne/afs";
2
+
3
+ //#region src/explorer/screen.d.ts
4
+ interface ExplorerScreenOptions {
5
+ afs: AFS;
6
+ startPath?: string;
7
+ version: string;
8
+ /** Custom input stream (for remote/WebSocket sessions). */
9
+ input?: NodeJS.ReadableStream;
10
+ /** Custom output stream (for remote/WebSocket sessions). */
11
+ output?: NodeJS.WritableStream;
12
+ /** Terminal type override. */
13
+ terminal?: string;
14
+ /** Called when the screen is destroyed (instead of process.exit). */
15
+ onExit?: () => void;
16
+ }
17
+ /**
18
+ * Create and run the explorer screen
19
+ */
20
+ declare function createExplorerScreen(options: ExplorerScreenOptions): Promise<void>;
21
+ //#endregion
22
+ export { createExplorerScreen };
23
+ //# sourceMappingURL=screen.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.mts","names":[],"sources":["../../src/explorer/screen.ts"],"mappings":";;;UA6BiB,qBAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA;EACA,OAAA;EAI8B;EAF9B,KAAA,GAAQ,MAAA,CAAO,cAAA;EAJV;EAML,MAAA,GAAS,MAAA,CAAO,cAAA;EAJhB;EAMA,QAAA;EAJQ;EAMR,MAAA;AAAA;;;;iBAMoB,oBAAA,CAAqB,OAAA,EAAS,qBAAA,GAAwB,OAAA"}
@@ -0,0 +1,250 @@
1
+ import { colors } from "../ui/index.mjs";
2
+ import { createInitialState, executeAction, getExplain, loadDirectory, loadMetadata, navigation, readFileContent } from "./actions.mjs";
3
+ import { createDefaultRegistry } from "./keybindings.mjs";
4
+ import { createDialogManager } from "./components/dialog.mjs";
5
+ import { createFileList } from "./components/file-list.mjs";
6
+ import { createFunctionBar } from "./components/function-bar.mjs";
7
+ import { createMetadataPanel } from "./components/metadata-panel.mjs";
8
+ import { createStatusBar } from "./components/status-bar.mjs";
9
+ import "./components/index.mjs";
10
+ import { createStore } from "./state.mjs";
11
+ import blessed from "blessed";
12
+
13
+ //#region src/explorer/screen.ts
14
+ /**
15
+ * Create and run the explorer screen
16
+ */
17
+ async function createExplorerScreen(options) {
18
+ const { afs, startPath = "/", version } = options;
19
+ const isRemote = !!(options.input || options.output);
20
+ const store = createStore(createInitialState(startPath));
21
+ const registry = createDefaultRegistry();
22
+ const screenOpts = {
23
+ smartCSR: true,
24
+ title: "AFS Explorer",
25
+ terminal: options.terminal || "xterm",
26
+ fullUnicode: true,
27
+ warnings: false
28
+ };
29
+ if (options.input) screenOpts.input = options.input;
30
+ if (options.output) screenOpts.output = options.output;
31
+ const screen = blessed.screen(screenOpts);
32
+ createStatusBar(blessed, {
33
+ parent: screen,
34
+ store,
35
+ width: "100%",
36
+ top: 0
37
+ });
38
+ const fileList = createFileList(blessed, {
39
+ parent: screen,
40
+ store,
41
+ width: "70%",
42
+ height: "100%-2",
43
+ top: 1,
44
+ left: 0
45
+ });
46
+ const metadataPanel = createMetadataPanel(blessed, {
47
+ parent: screen,
48
+ width: "30%",
49
+ height: "100%-2",
50
+ top: 1,
51
+ right: 0
52
+ });
53
+ createFunctionBar(blessed, {
54
+ parent: screen,
55
+ registry,
56
+ width: "100%",
57
+ bottom: 0
58
+ });
59
+ const dialogs = createDialogManager(blessed, { parent: screen });
60
+ const mountCount = afs.getMounts().length;
61
+ async function loadPath(path) {
62
+ store.setState({
63
+ loading: true,
64
+ error: void 0
65
+ });
66
+ const result = await loadDirectory(afs, path);
67
+ store.setState({
68
+ currentPath: path,
69
+ entries: result.entries,
70
+ selectedIndex: 0,
71
+ scrollOffset: 0,
72
+ loading: false,
73
+ error: result.error
74
+ });
75
+ updateMetadata();
76
+ }
77
+ async function updateMetadata() {
78
+ const selected = navigation.getSelected(store.getState());
79
+ if (selected) {
80
+ const metadata = await loadMetadata(afs, selected);
81
+ metadataPanel.update(selected, metadata);
82
+ } else metadataPanel.clear();
83
+ }
84
+ async function handleEnter() {
85
+ const selected = navigation.getSelected(store.getState());
86
+ if (!selected) return;
87
+ if (selected.type === "directory" || selected.type === "up") await loadPath(selected.path);
88
+ else if (selected.type === "file") await handleView();
89
+ }
90
+ async function handleBack() {
91
+ const state = store.getState();
92
+ const parentPath = navigation.getParentPath(state.currentPath);
93
+ if (parentPath !== state.currentPath) await loadPath(parentPath);
94
+ }
95
+ async function handleView() {
96
+ const selected = navigation.getSelected(store.getState());
97
+ if (!selected || selected.type === "up") return;
98
+ if (selected.type === "file") {
99
+ dialogs.showLoading("Loading file");
100
+ const result = await readFileContent(afs, selected.path);
101
+ if (result.error) dialogs.showError("View Error", result.error);
102
+ else dialogs.showFileView(selected.path, result.content);
103
+ } else if (selected.type === "directory") await loadPath(selected.path);
104
+ }
105
+ async function handleExplain() {
106
+ const selected = navigation.getSelected(store.getState());
107
+ if (!selected || selected.type === "up") return;
108
+ dialogs.showLoading("Getting explain info");
109
+ const result = await getExplain(afs, selected.path);
110
+ if (result.error) dialogs.showError("Explain Error", result.error);
111
+ else dialogs.showExplain(selected.path, result.content);
112
+ }
113
+ async function runAction(item) {
114
+ if (item.inputSchema) dialogs.showParamsInput(item.path, item.inputSchema, async (params) => {
115
+ dialogs.showLoading("Executing action");
116
+ const result = await executeAction(afs, item.path, item.name, params);
117
+ dialogs.showActionResult(item.name, result.success, result.message, result.data);
118
+ });
119
+ else {
120
+ dialogs.showLoading("Executing action");
121
+ const result = await executeAction(afs, item.path, item.name);
122
+ dialogs.showActionResult(item.name, result.success, result.message, result.data);
123
+ }
124
+ }
125
+ async function handleExec() {
126
+ const selected = navigation.getSelected(store.getState());
127
+ if (!selected || selected.type === "up") return;
128
+ const metadata = await loadMetadata(afs, selected);
129
+ const actionItems = [];
130
+ const actions = metadata?.actions ?? selected.actions;
131
+ if (actions && actions.length > 0) for (const action of actions) {
132
+ let inputSchema = action.inputSchema;
133
+ if (!inputSchema) try {
134
+ const actionPath = `${selected.path}/.actions/${action.name}`;
135
+ inputSchema = (await afs.stat(actionPath)).data?.meta?.inputSchema;
136
+ } catch {}
137
+ actionItems.push({
138
+ name: action.name,
139
+ path: `${selected.path}/.actions/${action.name}`,
140
+ description: action.description,
141
+ inputSchema
142
+ });
143
+ }
144
+ if (selected.type === "exec") {
145
+ const inputSchema = metadata?.extra?.inputSchema;
146
+ actionItems.push({
147
+ name: "Execute",
148
+ path: selected.path,
149
+ description: "Execute this node directly",
150
+ inputSchema
151
+ });
152
+ }
153
+ if (actionItems.length === 0) {
154
+ dialogs.showError("No Actions", `${selected.name} has no available actions`);
155
+ return;
156
+ }
157
+ if (actionItems.length === 1) {
158
+ await runAction(actionItems[0]);
159
+ return;
160
+ }
161
+ dialogs.showActionPicker(selected.path, actionItems, async (item) => {
162
+ await runAction(item);
163
+ });
164
+ }
165
+ async function handleRefresh() {
166
+ await loadPath(store.getState().currentPath);
167
+ }
168
+ const actionHandlers = {
169
+ help: () => dialogs.showHelp(registry),
170
+ explain: handleExplain,
171
+ view: handleView,
172
+ exec: handleExec,
173
+ refresh: handleRefresh,
174
+ quit: () => {
175
+ dialogs.showConfirm("Are you sure you want to quit?", async () => {
176
+ if (isRemote || options.onExit) {
177
+ screen.destroy();
178
+ options.onExit?.();
179
+ return;
180
+ }
181
+ const logo = colors.brightCyan("▄▀█ █▀▀ █▀\n█▀█ █▀░ ▄█\n");
182
+ const tagline = colors.dim("Agentic File System");
183
+ const versionPart = colors.green(`v${version}`);
184
+ const mountPart = colors.yellow(`${mountCount} ${mountCount === 1 ? "mount" : "mounts"}`);
185
+ const farewell = `\n${logo}${tagline}\n\n${`${versionPart} ${colors.dim("•")} ${mountPart}`}\n${colors.dim("Thanks for using AFS Explorer!")}\n`;
186
+ screen.destroy();
187
+ process.stdout.write(farewell);
188
+ process.exit(0);
189
+ });
190
+ },
191
+ "nav:up": () => {
192
+ store.setState(navigation.up(store.getState()));
193
+ updateMetadata();
194
+ },
195
+ "nav:down": () => {
196
+ store.setState(navigation.down(store.getState()));
197
+ updateMetadata();
198
+ },
199
+ "nav:enter": handleEnter,
200
+ "nav:back": handleBack,
201
+ "nav:home": () => {
202
+ store.setState(navigation.home(store.getState()));
203
+ updateMetadata();
204
+ },
205
+ "nav:end": () => {
206
+ store.setState(navigation.end(store.getState()));
207
+ updateMetadata();
208
+ },
209
+ "nav:pageup": () => {
210
+ store.setState(navigation.pageUp(store.getState(), fileList.getVisibleHeight()));
211
+ updateMetadata();
212
+ },
213
+ "nav:pagedown": () => {
214
+ store.setState(navigation.pageDown(store.getState(), fileList.getVisibleHeight()));
215
+ updateMetadata();
216
+ },
217
+ cancel: () => {
218
+ if (dialogs.isOpen()) dialogs.close();
219
+ else actionHandlers.quit?.();
220
+ }
221
+ };
222
+ screen.on("keypress", async (ch, key) => {
223
+ if (dialogs.isOpen()) return;
224
+ const keyName = key.name || ch;
225
+ if (!keyName) return;
226
+ const binding = registry.getBindingForKey(keyName);
227
+ if (binding) {
228
+ const handler = actionHandlers[binding.action];
229
+ if (handler) {
230
+ await handler();
231
+ screen.render();
232
+ }
233
+ }
234
+ });
235
+ screen.on("resize", () => {
236
+ screen.render();
237
+ });
238
+ fileList.focus();
239
+ await loadPath(startPath);
240
+ screen.render();
241
+ return new Promise((resolve) => {
242
+ screen.on("destroy", () => {
243
+ resolve();
244
+ });
245
+ });
246
+ }
247
+
248
+ //#endregion
249
+ export { createExplorerScreen };
250
+ //# sourceMappingURL=screen.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.mjs","names":[],"sources":["../../src/explorer/screen.ts"],"sourcesContent":["/**\n * AFS Explorer Screen\n *\n * Main screen controller that manages all UI components and user interaction.\n */\n\nimport type { AFS } from \"@aigne/afs\";\nimport blessed from \"blessed\";\nimport { colors } from \"../ui/index.js\";\nimport {\n createInitialState,\n executeAction,\n getExplain,\n loadDirectory,\n loadMetadata,\n navigation,\n readFileContent,\n} from \"./actions.js\";\nimport {\n createDialogManager,\n createFileList,\n createFunctionBar,\n createMetadataPanel,\n createStatusBar,\n} from \"./components/index.js\";\nimport { createDefaultRegistry } from \"./keybindings.js\";\nimport { createStore } from \"./state.js\";\nimport type { ActionItem } from \"./types.js\";\n\nexport interface ExplorerScreenOptions {\n afs: AFS;\n startPath?: string;\n version: string;\n /** Custom input stream (for remote/WebSocket sessions). */\n input?: NodeJS.ReadableStream;\n /** Custom output stream (for remote/WebSocket sessions). */\n output?: NodeJS.WritableStream;\n /** Terminal type override. */\n terminal?: string;\n /** Called when the screen is destroyed (instead of process.exit). */\n onExit?: () => void;\n}\n\n/**\n * Create and run the explorer screen\n */\nexport async function createExplorerScreen(options: ExplorerScreenOptions): Promise<void> {\n const { afs, startPath = \"/\", version } = options;\n const isRemote = !!(options.input || options.output);\n\n // Create store with initial state\n const store = createStore(createInitialState(startPath));\n\n // Create key binding registry\n const registry = createDefaultRegistry();\n\n // Create blessed screen\n // Use 'xterm' terminal to avoid Setulc parsing warnings with xterm-256color\n const screenOpts: Record<string, unknown> = {\n smartCSR: true,\n title: \"AFS Explorer\",\n terminal: options.terminal || \"xterm\",\n fullUnicode: true,\n warnings: false,\n };\n if (options.input) screenOpts.input = options.input;\n if (options.output) screenOpts.output = options.output;\n const screen = blessed.screen(screenOpts);\n\n // Create components\n const _statusBar = createStatusBar(blessed, {\n parent: screen,\n store,\n width: \"100%\",\n top: 0,\n });\n\n const fileList = createFileList(blessed, {\n parent: screen,\n store,\n width: \"70%\",\n height: \"100%-2\",\n top: 1,\n left: 0,\n });\n\n const metadataPanel = createMetadataPanel(blessed, {\n parent: screen,\n width: \"30%\",\n height: \"100%-2\",\n top: 1,\n right: 0,\n });\n\n const _functionBar = createFunctionBar(blessed, {\n parent: screen,\n registry,\n width: \"100%\",\n bottom: 0,\n });\n\n const dialogs = createDialogManager(blessed, {\n parent: screen,\n });\n\n // Get mount count\n const mountCount = afs.getMounts().length;\n\n // Load initial directory\n async function loadPath(path: string): Promise<void> {\n store.setState({ loading: true, error: undefined });\n\n const result = await loadDirectory(afs, path);\n\n store.setState({\n currentPath: path,\n entries: result.entries,\n selectedIndex: 0,\n scrollOffset: 0,\n loading: false,\n error: result.error,\n });\n\n // Update metadata panel for first entry\n updateMetadata();\n }\n\n // Update metadata panel for selected entry\n async function updateMetadata(): Promise<void> {\n const selected = navigation.getSelected(store.getState());\n if (selected) {\n const metadata = await loadMetadata(afs, selected);\n metadataPanel.update(selected, metadata);\n } else {\n metadataPanel.clear();\n }\n }\n\n // Handle navigation\n async function handleEnter(): Promise<void> {\n const selected = navigation.getSelected(store.getState());\n if (!selected) return;\n\n if (selected.type === \"directory\" || selected.type === \"up\") {\n await loadPath(selected.path);\n } else if (selected.type === \"file\") {\n await handleView();\n }\n }\n\n // Handle back navigation\n async function handleBack(): Promise<void> {\n const state = store.getState();\n const parentPath = navigation.getParentPath(state.currentPath);\n if (parentPath !== state.currentPath) {\n await loadPath(parentPath);\n }\n }\n\n // Handle view action (F3)\n async function handleView(): Promise<void> {\n const selected = navigation.getSelected(store.getState());\n if (!selected || selected.type === \"up\") return;\n\n if (selected.type === \"file\") {\n // Read file content directly\n // For parameterized content (like prompts with args), use F4 (Exec) to execute with params\n dialogs.showLoading(\"Loading file\");\n const result = await readFileContent(afs, selected.path);\n if (result.error) {\n dialogs.showError(\"View Error\", result.error);\n } else {\n dialogs.showFileView(selected.path, result.content);\n }\n } else if (selected.type === \"directory\") {\n // Enter directory\n await loadPath(selected.path);\n }\n }\n\n // Handle explain action (F2)\n async function handleExplain(): Promise<void> {\n const selected = navigation.getSelected(store.getState());\n if (!selected || selected.type === \"up\") return;\n\n dialogs.showLoading(\"Getting explain info\");\n const result = await getExplain(afs, selected.path);\n if (result.error) {\n dialogs.showError(\"Explain Error\", result.error);\n } else {\n dialogs.showExplain(selected.path, result.content);\n }\n }\n\n // Execute a single action (used by unified F4)\n async function runAction(item: ActionItem): Promise<void> {\n // Show params form if inputSchema exists (even if no properties - for confirmation)\n if (item.inputSchema) {\n dialogs.showParamsInput(item.path, item.inputSchema, async (params) => {\n dialogs.showLoading(\"Executing action\");\n const result = await executeAction(afs, item.path, item.name, params);\n dialogs.showActionResult(item.name, result.success, result.message, result.data);\n });\n } else {\n // No inputSchema - execute directly\n dialogs.showLoading(\"Executing action\");\n const result = await executeAction(afs, item.path, item.name);\n dialogs.showActionResult(item.name, result.success, result.message, result.data);\n }\n }\n\n // Handle exec action (F4/x) - Unified logic\n async function handleExec(): Promise<void> {\n const selected = navigation.getSelected(store.getState());\n if (!selected || selected.type === \"up\") return;\n\n // Load enriched metadata (includes actions from stat)\n const metadata = await loadMetadata(afs, selected);\n\n // Build actions list - prefer enriched metadata.actions over selected.actions\n const actionItems: ActionItem[] = [];\n const actions = metadata?.actions ?? selected.actions;\n\n // 1. Add node's own actions (from enriched metadata or initial list)\n if (actions && actions.length > 0) {\n for (const action of actions) {\n // If action doesn't have inputSchema, try to load it from stat\n let inputSchema = action.inputSchema as Record<string, unknown> | undefined;\n if (!inputSchema) {\n try {\n const actionPath = `${selected.path}/.actions/${action.name}`;\n const actionStat = await afs.stat(actionPath);\n inputSchema = actionStat.data?.meta?.inputSchema as Record<string, unknown> | undefined;\n } catch {\n // Ignore - action might not have inputSchema\n }\n }\n\n actionItems.push({\n name: action.name,\n path: `${selected.path}/.actions/${action.name}`,\n description: action.description,\n inputSchema,\n });\n }\n }\n\n // 2. If node is exec type, add default \"Execute\" action\n if (selected.type === \"exec\") {\n const inputSchema = metadata?.extra?.inputSchema as Record<string, unknown> | undefined;\n\n actionItems.push({\n name: \"Execute\",\n path: selected.path,\n description: \"Execute this node directly\",\n inputSchema,\n });\n }\n\n // 3. If no actions available, show error\n if (actionItems.length === 0) {\n dialogs.showError(\"No Actions\", `${selected.name} has no available actions`);\n return;\n }\n\n // 4. If only one action, execute directly\n if (actionItems.length === 1) {\n await runAction(actionItems[0]!);\n return;\n }\n\n // 5. Multiple actions - show picker\n dialogs.showActionPicker(selected.path, actionItems, async (item) => {\n await runAction(item);\n });\n }\n\n // Handle refresh action (F5)\n async function handleRefresh(): Promise<void> {\n const state = store.getState();\n await loadPath(state.currentPath);\n }\n\n // Action handlers map\n const actionHandlers: Record<string, () => void | Promise<void>> = {\n help: () => dialogs.showHelp(registry),\n explain: handleExplain,\n view: handleView,\n exec: handleExec,\n refresh: handleRefresh,\n quit: () => {\n dialogs.showConfirm(\"Are you sure you want to quit?\", async () => {\n // If onExit callback provided, use it instead of process.exit\n // This allows embedding explore in a REPL without killing the process\n if (isRemote || options.onExit) {\n screen.destroy();\n options.onExit?.();\n return;\n }\n // Prepare farewell message before destroying screen (match header.ts format)\n const logo = colors.brightCyan(\"▄▀█ █▀▀ █▀\\n█▀█ █▀░ ▄█\\n\");\n const tagline = colors.dim(\"Agentic File System\");\n const versionPart = colors.green(`v${version}`);\n const mountPart = colors.yellow(`${mountCount} ${mountCount === 1 ? \"mount\" : \"mounts\"}`);\n const statusLine = `${versionPart} ${colors.dim(\"•\")} ${mountPart}`;\n const farewell = `\\n${logo}${tagline}\\n\\n${statusLine}\\n${colors.dim(\"Thanks for using AFS Explorer!\")}\\n`;\n // Destroy screen and immediately print\n screen.destroy();\n process.stdout.write(farewell);\n process.exit(0);\n });\n },\n \"nav:up\": () => {\n store.setState(navigation.up(store.getState()));\n updateMetadata();\n },\n \"nav:down\": () => {\n store.setState(navigation.down(store.getState()));\n updateMetadata();\n },\n \"nav:enter\": handleEnter,\n \"nav:back\": handleBack,\n \"nav:home\": () => {\n store.setState(navigation.home(store.getState()));\n updateMetadata();\n },\n \"nav:end\": () => {\n store.setState(navigation.end(store.getState()));\n updateMetadata();\n },\n \"nav:pageup\": () => {\n store.setState(navigation.pageUp(store.getState(), fileList.getVisibleHeight()));\n updateMetadata();\n },\n \"nav:pagedown\": () => {\n store.setState(navigation.pageDown(store.getState(), fileList.getVisibleHeight()));\n updateMetadata();\n },\n cancel: () => {\n if (dialogs.isOpen()) {\n dialogs.close();\n } else {\n // ESC on main screen triggers quit with confirmation\n actionHandlers.quit?.();\n }\n },\n };\n\n // Bind keys\n screen.on(\"keypress\", async (ch, key) => {\n // Skip if dialog is handling keys\n if (dialogs.isOpen()) return;\n\n const keyName = key.name || ch;\n if (!keyName) return;\n\n // Note: Not passing full context since default bindings don't have conditions\n const binding = registry.getBindingForKey(keyName);\n\n if (binding) {\n const handler = actionHandlers[binding.action];\n if (handler) {\n await handler();\n screen.render();\n }\n }\n });\n\n // Handle resize\n screen.on(\"resize\", () => {\n screen.render();\n });\n\n // Focus file list\n fileList.focus();\n\n // Load initial directory\n await loadPath(startPath);\n\n // Render\n screen.render();\n\n // Return promise that resolves when screen is destroyed\n return new Promise((resolve) => {\n screen.on(\"destroy\", () => {\n resolve();\n });\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+
2
+ //#region src/explorer/state.ts
3
+ /**
4
+ * State store for explorer
5
+ */
6
+ var ExplorerStore = class {
7
+ state;
8
+ listeners = /* @__PURE__ */ new Set();
9
+ constructor(initialState) {
10
+ this.state = initialState;
11
+ }
12
+ /**
13
+ * Get current state
14
+ */
15
+ getState() {
16
+ return this.state;
17
+ }
18
+ /**
19
+ * Update state with partial update
20
+ */
21
+ setState(update) {
22
+ const prevState = this.state;
23
+ this.state = {
24
+ ...this.state,
25
+ ...update
26
+ };
27
+ for (const listener of this.listeners) listener(this.state, prevState);
28
+ }
29
+ /**
30
+ * Subscribe to state changes
31
+ */
32
+ subscribe(listener) {
33
+ this.listeners.add(listener);
34
+ return () => this.listeners.delete(listener);
35
+ }
36
+ /**
37
+ * Reset to initial state
38
+ */
39
+ reset(initialState) {
40
+ const prevState = this.state;
41
+ this.state = initialState;
42
+ for (const listener of this.listeners) listener(this.state, prevState);
43
+ }
44
+ };
45
+ /**
46
+ * Create a new store with initial state
47
+ */
48
+ function createStore(initialState) {
49
+ return new ExplorerStore(initialState);
50
+ }
51
+
52
+ //#endregion
53
+ exports.createStore = createStore;