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

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 +192 -0
  217. package/dist/credential/mcp-auth-context.d.mts +1 -0
  218. package/dist/credential/mcp-auth-context.mjs +192 -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,53 @@
1
+ //#region src/explorer/state.ts
2
+ /**
3
+ * State store for explorer
4
+ */
5
+ var ExplorerStore = class {
6
+ state;
7
+ listeners = /* @__PURE__ */ new Set();
8
+ constructor(initialState) {
9
+ this.state = initialState;
10
+ }
11
+ /**
12
+ * Get current state
13
+ */
14
+ getState() {
15
+ return this.state;
16
+ }
17
+ /**
18
+ * Update state with partial update
19
+ */
20
+ setState(update) {
21
+ const prevState = this.state;
22
+ this.state = {
23
+ ...this.state,
24
+ ...update
25
+ };
26
+ for (const listener of this.listeners) listener(this.state, prevState);
27
+ }
28
+ /**
29
+ * Subscribe to state changes
30
+ */
31
+ subscribe(listener) {
32
+ this.listeners.add(listener);
33
+ return () => this.listeners.delete(listener);
34
+ }
35
+ /**
36
+ * Reset to initial state
37
+ */
38
+ reset(initialState) {
39
+ const prevState = this.state;
40
+ this.state = initialState;
41
+ for (const listener of this.listeners) listener(this.state, prevState);
42
+ }
43
+ };
44
+ /**
45
+ * Create a new store with initial state
46
+ */
47
+ function createStore(initialState) {
48
+ return new ExplorerStore(initialState);
49
+ }
50
+
51
+ //#endregion
52
+ export { createStore };
53
+ //# sourceMappingURL=state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../../src/explorer/state.ts"],"sourcesContent":["/**\n * AFS Explorer State Management\n *\n * Simple state management for the explorer.\n */\n\nimport type { ExplorerState } from \"./types.js\";\n\n/**\n * State change listener\n */\nexport type StateListener = (state: ExplorerState, prevState: ExplorerState) => void;\n\n/**\n * State store for explorer\n */\nexport class ExplorerStore {\n private state: ExplorerState;\n private listeners: Set<StateListener> = new Set();\n\n constructor(initialState: ExplorerState) {\n this.state = initialState;\n }\n\n /**\n * Get current state\n */\n getState(): ExplorerState {\n return this.state;\n }\n\n /**\n * Update state with partial update\n */\n setState(update: Partial<ExplorerState>): void {\n const prevState = this.state;\n this.state = { ...this.state, ...update };\n\n // Notify listeners\n for (const listener of this.listeners) {\n listener(this.state, prevState);\n }\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Reset to initial state\n */\n reset(initialState: ExplorerState): void {\n const prevState = this.state;\n this.state = initialState;\n\n for (const listener of this.listeners) {\n listener(this.state, prevState);\n }\n }\n}\n\n/**\n * Create a new store with initial state\n */\nexport function createStore(initialState: ExplorerState): ExplorerStore {\n return new ExplorerStore(initialState);\n}\n"],"mappings":";;;;AAgBA,IAAa,gBAAb,MAA2B;CACzB,AAAQ;CACR,AAAQ,4BAAgC,IAAI,KAAK;CAEjD,YAAY,cAA6B;AACvC,OAAK,QAAQ;;;;;CAMf,WAA0B;AACxB,SAAO,KAAK;;;;;CAMd,SAAS,QAAsC;EAC7C,MAAM,YAAY,KAAK;AACvB,OAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,GAAG;GAAQ;AAGzC,OAAK,MAAM,YAAY,KAAK,UAC1B,UAAS,KAAK,OAAO,UAAU;;;;;CAOnC,UAAU,UAAqC;AAC7C,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa,KAAK,UAAU,OAAO,SAAS;;;;;CAM9C,MAAM,cAAmC;EACvC,MAAM,YAAY,KAAK;AACvB,OAAK,QAAQ;AAEb,OAAK,MAAM,YAAY,KAAK,UAC1B,UAAS,KAAK,OAAO,UAAU;;;;;;AAQrC,SAAgB,YAAY,cAA4C;AACtE,QAAO,IAAI,cAAc,aAAa"}
@@ -0,0 +1,160 @@
1
+
2
+ //#region src/explorer/theme.ts
3
+ /**
4
+ * AFS Explorer Theme
5
+ *
6
+ * PC Tools Deluxe classic blue color scheme
7
+ */
8
+ /**
9
+ * Color definitions for PC Tools theme
10
+ */
11
+ const Colors = {
12
+ bg: {
13
+ main: "blue",
14
+ selected: "cyan",
15
+ functionKey: "cyan",
16
+ dialog: "blue",
17
+ dialogBorder: "white",
18
+ input: "black",
19
+ inputFocus: "cyan"
20
+ },
21
+ fg: {
22
+ normal: "cyan",
23
+ selected: "black",
24
+ title: "white",
25
+ border: "cyan",
26
+ directory: "yellow",
27
+ file: "white",
28
+ exec: "green",
29
+ link: "magenta",
30
+ up: "yellow",
31
+ size: "cyan",
32
+ date: "cyan",
33
+ functionKeyLabel: "black",
34
+ functionKeyText: "white",
35
+ status: "yellow",
36
+ error: "red",
37
+ muted: "gray"
38
+ }
39
+ };
40
+ /**
41
+ * Blessed style objects for components
42
+ */
43
+ const Styles = {
44
+ screen: { bg: Colors.bg.main },
45
+ border: {
46
+ type: "line",
47
+ fg: Colors.fg.border,
48
+ bg: Colors.bg.main
49
+ },
50
+ title: {
51
+ fg: Colors.fg.title,
52
+ bg: Colors.bg.main,
53
+ bold: true
54
+ },
55
+ listItem: {
56
+ fg: Colors.fg.normal,
57
+ bg: Colors.bg.main
58
+ },
59
+ listItemSelected: {
60
+ fg: Colors.fg.selected,
61
+ bg: Colors.bg.selected,
62
+ bold: true
63
+ },
64
+ directory: {
65
+ fg: Colors.fg.directory,
66
+ bg: Colors.bg.main,
67
+ bold: true
68
+ },
69
+ directorySelected: {
70
+ fg: "black",
71
+ bg: Colors.bg.selected,
72
+ bold: true
73
+ },
74
+ file: {
75
+ fg: Colors.fg.file,
76
+ bg: Colors.bg.main
77
+ },
78
+ exec: {
79
+ fg: Colors.fg.exec,
80
+ bg: Colors.bg.main
81
+ },
82
+ functionKeyLabel: {
83
+ fg: Colors.fg.functionKeyLabel,
84
+ bg: Colors.bg.functionKey
85
+ },
86
+ functionKeyText: {
87
+ fg: Colors.fg.functionKeyText,
88
+ bg: Colors.bg.main
89
+ },
90
+ status: {
91
+ fg: Colors.fg.status,
92
+ bg: Colors.bg.main
93
+ },
94
+ meta: {
95
+ fg: Colors.fg.normal,
96
+ bg: Colors.bg.main
97
+ },
98
+ metadataLabel: {
99
+ fg: Colors.fg.muted,
100
+ bg: Colors.bg.main
101
+ },
102
+ metadataValue: {
103
+ fg: Colors.fg.normal,
104
+ bg: Colors.bg.main
105
+ },
106
+ error: {
107
+ fg: Colors.fg.error,
108
+ bg: Colors.bg.main,
109
+ bold: true
110
+ },
111
+ dialog: {
112
+ fg: Colors.fg.normal,
113
+ bg: Colors.bg.dialog,
114
+ border: {
115
+ type: "line",
116
+ fg: Colors.bg.dialogBorder,
117
+ bg: Colors.bg.dialog
118
+ }
119
+ }
120
+ };
121
+ /**
122
+ * Icons for different entry types
123
+ * Using ASCII characters for better terminal compatibility
124
+ */
125
+ const Icons = {
126
+ up: "[D]",
127
+ directory: "[D]",
128
+ file: " ",
129
+ exec: "[X]",
130
+ link: "[L]",
131
+ selected: ">",
132
+ unselected: " "
133
+ };
134
+ /**
135
+ * UI symbols
136
+ * Using ASCII characters for better terminal compatibility
137
+ */
138
+ const Symbols = {
139
+ folder: "[D]",
140
+ error: "X",
141
+ success: "OK",
142
+ scrollbar: "#",
143
+ loading: "..."
144
+ };
145
+ /**
146
+ * Format file size for display
147
+ */
148
+ function formatSize(bytes) {
149
+ if (bytes === void 0) return "";
150
+ if (bytes < 1024) return `${bytes}B`;
151
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
152
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
153
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
154
+ }
155
+
156
+ //#endregion
157
+ exports.Colors = Colors;
158
+ exports.Icons = Icons;
159
+ exports.Symbols = Symbols;
160
+ exports.formatSize = formatSize;
@@ -0,0 +1,157 @@
1
+ //#region src/explorer/theme.ts
2
+ /**
3
+ * AFS Explorer Theme
4
+ *
5
+ * PC Tools Deluxe classic blue color scheme
6
+ */
7
+ /**
8
+ * Color definitions for PC Tools theme
9
+ */
10
+ const Colors = {
11
+ bg: {
12
+ main: "blue",
13
+ selected: "cyan",
14
+ functionKey: "cyan",
15
+ dialog: "blue",
16
+ dialogBorder: "white",
17
+ input: "black",
18
+ inputFocus: "cyan"
19
+ },
20
+ fg: {
21
+ normal: "cyan",
22
+ selected: "black",
23
+ title: "white",
24
+ border: "cyan",
25
+ directory: "yellow",
26
+ file: "white",
27
+ exec: "green",
28
+ link: "magenta",
29
+ up: "yellow",
30
+ size: "cyan",
31
+ date: "cyan",
32
+ functionKeyLabel: "black",
33
+ functionKeyText: "white",
34
+ status: "yellow",
35
+ error: "red",
36
+ muted: "gray"
37
+ }
38
+ };
39
+ /**
40
+ * Blessed style objects for components
41
+ */
42
+ const Styles = {
43
+ screen: { bg: Colors.bg.main },
44
+ border: {
45
+ type: "line",
46
+ fg: Colors.fg.border,
47
+ bg: Colors.bg.main
48
+ },
49
+ title: {
50
+ fg: Colors.fg.title,
51
+ bg: Colors.bg.main,
52
+ bold: true
53
+ },
54
+ listItem: {
55
+ fg: Colors.fg.normal,
56
+ bg: Colors.bg.main
57
+ },
58
+ listItemSelected: {
59
+ fg: Colors.fg.selected,
60
+ bg: Colors.bg.selected,
61
+ bold: true
62
+ },
63
+ directory: {
64
+ fg: Colors.fg.directory,
65
+ bg: Colors.bg.main,
66
+ bold: true
67
+ },
68
+ directorySelected: {
69
+ fg: "black",
70
+ bg: Colors.bg.selected,
71
+ bold: true
72
+ },
73
+ file: {
74
+ fg: Colors.fg.file,
75
+ bg: Colors.bg.main
76
+ },
77
+ exec: {
78
+ fg: Colors.fg.exec,
79
+ bg: Colors.bg.main
80
+ },
81
+ functionKeyLabel: {
82
+ fg: Colors.fg.functionKeyLabel,
83
+ bg: Colors.bg.functionKey
84
+ },
85
+ functionKeyText: {
86
+ fg: Colors.fg.functionKeyText,
87
+ bg: Colors.bg.main
88
+ },
89
+ status: {
90
+ fg: Colors.fg.status,
91
+ bg: Colors.bg.main
92
+ },
93
+ meta: {
94
+ fg: Colors.fg.normal,
95
+ bg: Colors.bg.main
96
+ },
97
+ metadataLabel: {
98
+ fg: Colors.fg.muted,
99
+ bg: Colors.bg.main
100
+ },
101
+ metadataValue: {
102
+ fg: Colors.fg.normal,
103
+ bg: Colors.bg.main
104
+ },
105
+ error: {
106
+ fg: Colors.fg.error,
107
+ bg: Colors.bg.main,
108
+ bold: true
109
+ },
110
+ dialog: {
111
+ fg: Colors.fg.normal,
112
+ bg: Colors.bg.dialog,
113
+ border: {
114
+ type: "line",
115
+ fg: Colors.bg.dialogBorder,
116
+ bg: Colors.bg.dialog
117
+ }
118
+ }
119
+ };
120
+ /**
121
+ * Icons for different entry types
122
+ * Using ASCII characters for better terminal compatibility
123
+ */
124
+ const Icons = {
125
+ up: "[D]",
126
+ directory: "[D]",
127
+ file: " ",
128
+ exec: "[X]",
129
+ link: "[L]",
130
+ selected: ">",
131
+ unselected: " "
132
+ };
133
+ /**
134
+ * UI symbols
135
+ * Using ASCII characters for better terminal compatibility
136
+ */
137
+ const Symbols = {
138
+ folder: "[D]",
139
+ error: "X",
140
+ success: "OK",
141
+ scrollbar: "#",
142
+ loading: "..."
143
+ };
144
+ /**
145
+ * Format file size for display
146
+ */
147
+ function formatSize(bytes) {
148
+ if (bytes === void 0) return "";
149
+ if (bytes < 1024) return `${bytes}B`;
150
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
151
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
152
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
153
+ }
154
+
155
+ //#endregion
156
+ export { Colors, Icons, Symbols, formatSize };
157
+ //# sourceMappingURL=theme.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.mjs","names":[],"sources":["../../src/explorer/theme.ts"],"sourcesContent":["/**\n * AFS Explorer Theme\n *\n * PC Tools Deluxe classic blue color scheme\n */\n\n/**\n * Color definitions for PC Tools theme\n */\nexport const Colors = {\n // Background colors\n bg: {\n main: \"blue\",\n selected: \"cyan\",\n functionKey: \"cyan\",\n dialog: \"blue\",\n dialogBorder: \"white\",\n input: \"black\",\n inputFocus: \"cyan\",\n },\n\n // Foreground colors (using standard blessed color names)\n fg: {\n normal: \"cyan\",\n selected: \"black\",\n title: \"white\",\n border: \"cyan\",\n directory: \"yellow\",\n file: \"white\",\n exec: \"green\",\n link: \"magenta\",\n up: \"yellow\",\n size: \"cyan\",\n date: \"cyan\",\n functionKeyLabel: \"black\",\n functionKeyText: \"white\",\n status: \"yellow\",\n error: \"red\",\n muted: \"gray\",\n },\n} as const;\n\n/**\n * Blessed style objects for components\n */\nexport const Styles = {\n /** Main screen background */\n screen: {\n bg: Colors.bg.main,\n },\n\n /** Box/panel borders */\n border: {\n type: \"line\" as const,\n fg: Colors.fg.border,\n bg: Colors.bg.main,\n },\n\n /** Title bar style */\n title: {\n fg: Colors.fg.title,\n bg: Colors.bg.main,\n bold: true,\n },\n\n /** Normal list item */\n listItem: {\n fg: Colors.fg.normal,\n bg: Colors.bg.main,\n },\n\n /** Selected list item */\n listItemSelected: {\n fg: Colors.fg.selected,\n bg: Colors.bg.selected,\n bold: true,\n },\n\n /** Directory entry */\n directory: {\n fg: Colors.fg.directory,\n bg: Colors.bg.main,\n bold: true,\n },\n\n /** Directory entry selected */\n directorySelected: {\n fg: \"black\",\n bg: Colors.bg.selected,\n bold: true,\n },\n\n /** File entry */\n file: {\n fg: Colors.fg.file,\n bg: Colors.bg.main,\n },\n\n /** Exec entry */\n exec: {\n fg: Colors.fg.exec,\n bg: Colors.bg.main,\n },\n\n /** Function key label (e.g., \"F1\") */\n functionKeyLabel: {\n fg: Colors.fg.functionKeyLabel,\n bg: Colors.bg.functionKey,\n },\n\n /** Function key text (e.g., \"Help\") */\n functionKeyText: {\n fg: Colors.fg.functionKeyText,\n bg: Colors.bg.main,\n },\n\n /** Status bar */\n status: {\n fg: Colors.fg.status,\n bg: Colors.bg.main,\n },\n\n /** Metadata panel */\n meta: {\n fg: Colors.fg.normal,\n bg: Colors.bg.main,\n },\n\n /** Metadata label */\n metadataLabel: {\n fg: Colors.fg.muted,\n bg: Colors.bg.main,\n },\n\n /** Metadata value */\n metadataValue: {\n fg: Colors.fg.normal,\n bg: Colors.bg.main,\n },\n\n /** Error message */\n error: {\n fg: Colors.fg.error,\n bg: Colors.bg.main,\n bold: true,\n },\n\n /** Dialog box */\n dialog: {\n fg: Colors.fg.normal,\n bg: Colors.bg.dialog,\n border: {\n type: \"line\" as const,\n fg: Colors.bg.dialogBorder,\n bg: Colors.bg.dialog,\n },\n },\n} as const;\n\n/**\n * Icons for different entry types\n * Using ASCII characters for better terminal compatibility\n */\nexport const Icons = {\n up: \"[D]\",\n directory: \"[D]\",\n file: \" \",\n exec: \"[X]\",\n link: \"[L]\",\n selected: \">\",\n unselected: \" \",\n} as const;\n\n/**\n * UI symbols\n * Using ASCII characters for better terminal compatibility\n */\nexport const Symbols = {\n folder: \"[D]\",\n error: \"X\",\n success: \"OK\",\n scrollbar: \"#\",\n loading: \"...\",\n} as const;\n\n/**\n * Box drawing characters\n */\nexport const BoxChars = {\n topLeft: \"┌\",\n topRight: \"┐\",\n bottomLeft: \"└\",\n bottomRight: \"┘\",\n horizontal: \"─\",\n vertical: \"│\",\n leftT: \"├\",\n rightT: \"┤\",\n topT: \"┬\",\n bottomT: \"┴\",\n cross: \"┼\",\n} as const;\n\n/**\n * Get style for entry based on type and selection state\n */\nexport function getEntryStyle(\n type: \"file\" | \"directory\" | \"exec\" | \"link\" | \"up\",\n selected: boolean,\n): { fg: string; bg: string; bold?: boolean } {\n if (selected) {\n if (type === \"directory\" || type === \"up\") {\n return Styles.directorySelected;\n }\n return Styles.listItemSelected;\n }\n\n switch (type) {\n case \"directory\":\n case \"up\":\n return Styles.directory;\n case \"exec\":\n return Styles.exec;\n default:\n return Styles.file;\n }\n}\n\n/**\n * Get icon for entry type\n */\nexport function getEntryIcon(type: \"file\" | \"directory\" | \"exec\" | \"link\" | \"up\"): string {\n return Icons[type] || Icons.file;\n}\n\n/**\n * Format file size for display\n */\nexport function formatSize(bytes: number | undefined): string {\n if (bytes === undefined) return \"\";\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(date: Date | undefined): string {\n if (!date) return \"\";\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) {\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n }\n if (days < 7) {\n return `${days}d ago`;\n }\n return date.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n}\n\n/**\n * Format an entry line for display (not used in blessed components)\n */\nexport function formatEntryLine(\n name: string,\n type: \"file\" | \"directory\" | \"exec\" | \"link\" | \"up\",\n size?: number,\n date?: Date,\n): string {\n const icon = getEntryIcon(type);\n const sizeStr = formatSize(size);\n const dateStr = formatDate(date);\n return `${icon} ${name} ${sizeStr} ${dateStr}`;\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,SAAS;CAEpB,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;EACb,QAAQ;EACR,cAAc;EACd,OAAO;EACP,YAAY;EACb;CAGD,IAAI;EACF,QAAQ;EACR,UAAU;EACV,OAAO;EACP,QAAQ;EACR,WAAW;EACX,MAAM;EACN,MAAM;EACN,MAAM;EACN,IAAI;EACJ,MAAM;EACN,MAAM;EACN,kBAAkB;EAClB,iBAAiB;EACjB,QAAQ;EACR,OAAO;EACP,OAAO;EACR;CACF;;;;AAKD,MAAa,SAAS;CAEpB,QAAQ,EACN,IAAI,OAAO,GAAG,MACf;CAGD,QAAQ;EACN,MAAM;EACN,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,OAAO;EACL,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACd,MAAM;EACP;CAGD,UAAU;EACR,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,kBAAkB;EAChB,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACd,MAAM;EACP;CAGD,WAAW;EACT,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACd,MAAM;EACP;CAGD,mBAAmB;EACjB,IAAI;EACJ,IAAI,OAAO,GAAG;EACd,MAAM;EACP;CAGD,MAAM;EACJ,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,MAAM;EACJ,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,kBAAkB;EAChB,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,iBAAiB;EACf,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,QAAQ;EACN,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,MAAM;EACJ,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,eAAe;EACb,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,eAAe;EACb,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACf;CAGD,OAAO;EACL,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACd,MAAM;EACP;CAGD,QAAQ;EACN,IAAI,OAAO,GAAG;EACd,IAAI,OAAO,GAAG;EACd,QAAQ;GACN,MAAM;GACN,IAAI,OAAO,GAAG;GACd,IAAI,OAAO,GAAG;GACf;EACF;CACF;;;;;AAMD,MAAa,QAAQ;CACnB,IAAI;CACJ,WAAW;CACX,MAAM;CACN,MAAM;CACN,MAAM;CACN,UAAU;CACV,YAAY;CACb;;;;;AAMD,MAAa,UAAU;CACrB,QAAQ;CACR,OAAO;CACP,SAAS;CACT,WAAW;CACX,SAAS;CACV;;;;AAsDD,SAAgB,WAAW,OAAmC;AAC5D,KAAI,UAAU,OAAW,QAAO;AAChC,KAAI,QAAQ,KAAM,QAAO,GAAG,MAAM;AAClC,KAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAC7D,KAAI,QAAQ,OAAO,OAAO,KAAM,QAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;AAC7E,QAAO,IAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,EAAE,CAAC"}
package/dist/index.cjs ADDED
@@ -0,0 +1,12 @@
1
+ const require_store = require('./credential/store.cjs');
2
+ require('./credential/index.cjs');
3
+ const require_screen = require('./explorer/screen.cjs');
4
+ const require_version = require('./version.cjs');
5
+ const require_repl = require('./repl.cjs');
6
+ const require_serve = require('./serve.cjs');
7
+
8
+ exports.VERSION = require_version.VERSION;
9
+ exports.createCredentialStore = require_store.createCredentialStore;
10
+ exports.createExplorerScreen = require_screen.createExplorerScreen;
11
+ exports.startRepl = require_repl.startRepl;
12
+ exports.startServe = require_serve.startServe;
@@ -0,0 +1,6 @@
1
+ import { CredentialStore, CredentialStoreOptions, Credentials, createCredentialStore } from "./credential/store.cjs";
2
+ import { createExplorerScreen } from "./explorer/screen.cjs";
3
+ import { startRepl } from "./repl.cjs";
4
+ import { StartServeOptions, startServe } from "./serve.cjs";
5
+ import { VERSION } from "./version.cjs";
6
+ export { type CredentialStore, type CredentialStoreOptions, type Credentials, type StartServeOptions, VERSION, createCredentialStore, createExplorerScreen, startRepl, startServe };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,7 @@
1
- //#region src/version.d.ts
2
- declare const VERSION = "1.11.0-beta";
3
- //#endregion
4
- export { VERSION };
1
+ import { CredentialStore, CredentialStoreOptions, Credentials, createCredentialStore } from "./credential/store.mjs";
2
+ import "./credential/index.mjs";
3
+ import { createExplorerScreen } from "./explorer/screen.mjs";
4
+ import { startRepl } from "./repl.mjs";
5
+ import { StartServeOptions, startServe } from "./serve.mjs";
6
+ import { VERSION } from "./version.mjs";
7
+ export { type CredentialStore, type CredentialStoreOptions, type Credentials, type StartServeOptions, VERSION, createCredentialStore, createExplorerScreen, startRepl, startServe };
package/dist/index.mjs CHANGED
@@ -1,3 +1,8 @@
1
- import { t as VERSION } from "./version--p6A8sKX.mjs";
1
+ import { createCredentialStore } from "./credential/store.mjs";
2
+ import "./credential/index.mjs";
3
+ import { createExplorerScreen } from "./explorer/screen.mjs";
4
+ import { VERSION } from "./version.mjs";
5
+ import { startRepl } from "./repl.mjs";
6
+ import { startServe } from "./serve.mjs";
2
7
 
3
- export { VERSION };
8
+ export { VERSION, createCredentialStore, createExplorerScreen, startRepl, startServe };
@@ -0,0 +1,87 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ let node_crypto = require("node:crypto");
3
+ let node_http = require("node:http");
4
+ let _modelcontextprotocol_sdk_server_streamableHttp_js = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
5
+
6
+ //#region src/mcp/http-transport.ts
7
+ /**
8
+ * MCP HTTP Transport
9
+ *
10
+ * Starts an HTTP server that serves MCP over Streamable HTTP transport.
11
+ * Creates a new transport per client session to support reconnection.
12
+ */
13
+ /**
14
+ * Start MCP server over Streamable HTTP transport.
15
+ *
16
+ * Creates a new transport per client session so that reconnections
17
+ * and multiple clients are supported.
18
+ */
19
+ async function startMcpHttpServer(options) {
20
+ const { mcpServer, host, port, cors } = options;
21
+ const sessions = /* @__PURE__ */ new Map();
22
+ const httpServer = (0, node_http.createServer)(async (req, res) => {
23
+ res.removeHeader("X-Powered-By");
24
+ if (cors) {
25
+ res.setHeader("Access-Control-Allow-Origin", "*");
26
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
27
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
28
+ if (req.method === "OPTIONS") {
29
+ res.writeHead(204);
30
+ res.end();
31
+ return;
32
+ }
33
+ }
34
+ if (new URL(req.url || "/", `http://${req.headers.host}`).pathname !== "/mcp") {
35
+ res.writeHead(404, { "Content-Type": "application/json" });
36
+ res.end(JSON.stringify({ error: "Not found" }));
37
+ return;
38
+ }
39
+ if (req.method !== "GET" && req.method !== "POST" && req.method !== "DELETE") {
40
+ res.writeHead(405, { "Content-Type": "application/json" });
41
+ res.end(JSON.stringify({ error: "Method not allowed" }));
42
+ return;
43
+ }
44
+ const sessionId = req.headers["mcp-session-id"];
45
+ let transport;
46
+ if (sessionId) transport = sessions.get(sessionId);
47
+ if (!transport) {
48
+ transport = new _modelcontextprotocol_sdk_server_streamableHttp_js.StreamableHTTPServerTransport({
49
+ sessionIdGenerator: () => (0, node_crypto.randomUUID)(),
50
+ onsessioninitialized: (sid) => {
51
+ sessions.set(sid, transport);
52
+ }
53
+ });
54
+ transport.onclose = () => {
55
+ const sid = transport.sessionId;
56
+ if (sid) sessions.delete(sid);
57
+ };
58
+ await mcpServer.connect(transport);
59
+ }
60
+ try {
61
+ await transport.handleRequest(req, res);
62
+ } catch {
63
+ if (!res.headersSent) {
64
+ res.writeHead(500, { "Content-Type": "application/json" });
65
+ res.end(JSON.stringify({ error: "Internal server error" }));
66
+ }
67
+ }
68
+ });
69
+ const actualPort = await new Promise((resolve, reject) => {
70
+ httpServer.on("error", reject);
71
+ httpServer.listen(port, host, () => {
72
+ const addr = httpServer.address();
73
+ if (addr && typeof addr === "object") resolve(addr.port);
74
+ else resolve(port);
75
+ });
76
+ });
77
+ const url = `http://${host}:${actualPort}/mcp`;
78
+ console.error(`MCP HTTP server listening on ${url}`);
79
+ return {
80
+ httpServer,
81
+ port: actualPort,
82
+ url
83
+ };
84
+ }
85
+
86
+ //#endregion
87
+ exports.startMcpHttpServer = startMcpHttpServer;
@@ -0,0 +1,87 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+
5
+ //#region src/mcp/http-transport.ts
6
+ /**
7
+ * MCP HTTP Transport
8
+ *
9
+ * Starts an HTTP server that serves MCP over Streamable HTTP transport.
10
+ * Creates a new transport per client session to support reconnection.
11
+ */
12
+ /**
13
+ * Start MCP server over Streamable HTTP transport.
14
+ *
15
+ * Creates a new transport per client session so that reconnections
16
+ * and multiple clients are supported.
17
+ */
18
+ async function startMcpHttpServer(options) {
19
+ const { mcpServer, host, port, cors } = options;
20
+ const sessions = /* @__PURE__ */ new Map();
21
+ const httpServer = createServer(async (req, res) => {
22
+ res.removeHeader("X-Powered-By");
23
+ if (cors) {
24
+ res.setHeader("Access-Control-Allow-Origin", "*");
25
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
26
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
27
+ if (req.method === "OPTIONS") {
28
+ res.writeHead(204);
29
+ res.end();
30
+ return;
31
+ }
32
+ }
33
+ if (new URL(req.url || "/", `http://${req.headers.host}`).pathname !== "/mcp") {
34
+ res.writeHead(404, { "Content-Type": "application/json" });
35
+ res.end(JSON.stringify({ error: "Not found" }));
36
+ return;
37
+ }
38
+ if (req.method !== "GET" && req.method !== "POST" && req.method !== "DELETE") {
39
+ res.writeHead(405, { "Content-Type": "application/json" });
40
+ res.end(JSON.stringify({ error: "Method not allowed" }));
41
+ return;
42
+ }
43
+ const sessionId = req.headers["mcp-session-id"];
44
+ let transport;
45
+ if (sessionId) transport = sessions.get(sessionId);
46
+ if (!transport) {
47
+ transport = new StreamableHTTPServerTransport({
48
+ sessionIdGenerator: () => randomUUID(),
49
+ onsessioninitialized: (sid) => {
50
+ sessions.set(sid, transport);
51
+ }
52
+ });
53
+ transport.onclose = () => {
54
+ const sid = transport.sessionId;
55
+ if (sid) sessions.delete(sid);
56
+ };
57
+ await mcpServer.connect(transport);
58
+ }
59
+ try {
60
+ await transport.handleRequest(req, res);
61
+ } catch {
62
+ if (!res.headersSent) {
63
+ res.writeHead(500, { "Content-Type": "application/json" });
64
+ res.end(JSON.stringify({ error: "Internal server error" }));
65
+ }
66
+ }
67
+ });
68
+ const actualPort = await new Promise((resolve, reject) => {
69
+ httpServer.on("error", reject);
70
+ httpServer.listen(port, host, () => {
71
+ const addr = httpServer.address();
72
+ if (addr && typeof addr === "object") resolve(addr.port);
73
+ else resolve(port);
74
+ });
75
+ });
76
+ const url = `http://${host}:${actualPort}/mcp`;
77
+ console.error(`MCP HTTP server listening on ${url}`);
78
+ return {
79
+ httpServer,
80
+ port: actualPort,
81
+ url
82
+ };
83
+ }
84
+
85
+ //#endregion
86
+ export { startMcpHttpServer };
87
+ //# sourceMappingURL=http-transport.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.mjs","names":[],"sources":["../../src/mcp/http-transport.ts"],"sourcesContent":["/**\n * MCP HTTP Transport\n *\n * Starts an HTTP server that serves MCP over Streamable HTTP transport.\n * Creates a new transport per client session to support reconnection.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\n\nexport interface StartMcpHttpServerOptions {\n mcpServer: McpServer;\n host: string;\n port: number;\n cors: boolean;\n}\n\nexport interface StartMcpHttpServerResult {\n httpServer: Server;\n port: number;\n url: string;\n}\n\n/**\n * Start MCP server over Streamable HTTP transport.\n *\n * Creates a new transport per client session so that reconnections\n * and multiple clients are supported.\n */\nexport async function startMcpHttpServer(\n options: StartMcpHttpServerOptions,\n): Promise<StartMcpHttpServerResult> {\n const { mcpServer, host, port, cors } = options;\n\n // Per-session transport map\n const sessions = new Map<string, StreamableHTTPServerTransport>();\n\n const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n // Strip version headers to avoid data leaks\n res.removeHeader(\"X-Powered-By\");\n\n // CORS handling\n if (cors) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, mcp-session-id\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n }\n\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n\n // Only handle /mcp path\n if (url.pathname !== \"/mcp\") {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n return;\n }\n\n // Only allow GET, POST, DELETE (MCP protocol methods)\n if (req.method !== \"GET\" && req.method !== \"POST\" && req.method !== \"DELETE\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n // Look up existing session or create new one for initialization requests\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport | undefined;\n\n if (sessionId) {\n transport = sessions.get(sessionId);\n }\n\n if (!transport) {\n // New session — create a new transport\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid) => {\n sessions.set(sid, transport!);\n },\n });\n\n transport.onclose = () => {\n const sid = transport!.sessionId;\n if (sid) sessions.delete(sid);\n };\n\n await mcpServer.connect(transport);\n }\n\n try {\n await transport.handleRequest(req, res);\n } catch {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }\n });\n\n // Start listening\n const actualPort = await new Promise<number>((resolve, reject) => {\n httpServer.on(\"error\", reject);\n httpServer.listen(port, host, () => {\n const addr = httpServer.address();\n if (addr && typeof addr === \"object\") {\n resolve(addr.port);\n } else {\n resolve(port);\n }\n });\n });\n\n const url = `http://${host}:${actualPort}/mcp`;\n\n // Print listening info to stderr (stdout reserved for protocol)\n console.error(`MCP HTTP server listening on ${url}`);\n\n return { httpServer, port: actualPort, url };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,eAAsB,mBACpB,SACmC;CACnC,MAAM,EAAE,WAAW,MAAM,MAAM,SAAS;CAGxC,MAAM,2BAAW,IAAI,KAA4C;CAEjE,MAAM,aAAa,aAAa,OAAO,KAAsB,QAAwB;AAEnF,MAAI,aAAa,eAAe;AAGhC,MAAI,MAAM;AACR,OAAI,UAAU,+BAA+B,IAAI;AACjD,OAAI,UAAU,gCAAgC,6BAA6B;AAC3E,OAAI,UAAU,gCAAgC,+BAA+B;AAE7E,OAAI,IAAI,WAAW,WAAW;AAC5B,QAAI,UAAU,IAAI;AAClB,QAAI,KAAK;AACT;;;AAOJ,MAHY,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,OAAO,CAGzD,aAAa,QAAQ;AAC3B,OAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC;AAC1D,OAAI,IAAI,KAAK,UAAU,EAAE,OAAO,aAAa,CAAC,CAAC;AAC/C;;AAIF,MAAI,IAAI,WAAW,SAAS,IAAI,WAAW,UAAU,IAAI,WAAW,UAAU;AAC5E,OAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC;AAC1D,OAAI,IAAI,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC,CAAC;AACxD;;EAIF,MAAM,YAAY,IAAI,QAAQ;EAC9B,IAAI;AAEJ,MAAI,UACF,aAAY,SAAS,IAAI,UAAU;AAGrC,MAAI,CAAC,WAAW;AAEd,eAAY,IAAI,8BAA8B;IAC5C,0BAA0B,YAAY;IACtC,uBAAuB,QAAQ;AAC7B,cAAS,IAAI,KAAK,UAAW;;IAEhC,CAAC;AAEF,aAAU,gBAAgB;IACxB,MAAM,MAAM,UAAW;AACvB,QAAI,IAAK,UAAS,OAAO,IAAI;;AAG/B,SAAM,UAAU,QAAQ,UAAU;;AAGpC,MAAI;AACF,SAAM,UAAU,cAAc,KAAK,IAAI;UACjC;AACN,OAAI,CAAC,IAAI,aAAa;AACpB,QAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC;AAC1D,QAAI,IAAI,KAAK,UAAU,EAAE,OAAO,yBAAyB,CAAC,CAAC;;;GAG/D;CAGF,MAAM,aAAa,MAAM,IAAI,SAAiB,SAAS,WAAW;AAChE,aAAW,GAAG,SAAS,OAAO;AAC9B,aAAW,OAAO,MAAM,YAAY;GAClC,MAAM,OAAO,WAAW,SAAS;AACjC,OAAI,QAAQ,OAAO,SAAS,SAC1B,SAAQ,KAAK,KAAK;OAElB,SAAQ,KAAK;IAEf;GACF;CAEF,MAAM,MAAM,UAAU,KAAK,GAAG,WAAW;AAGzC,SAAQ,MAAM,gCAAgC,MAAM;AAEpD,QAAO;EAAE;EAAY,MAAM;EAAY;EAAK"}
@@ -0,0 +1,48 @@
1
+
2
+ //#region src/mcp/prompts.ts
3
+ /**
4
+ * Register MCP prompts on the server.
5
+ */
6
+ function registerPrompts(server, afs) {
7
+ server.prompt("explore", "Explore the AFS virtual filesystem and learn how to use it", async () => {
8
+ const mountList = afs.getMounts().map((m) => {
9
+ const mode = m.module.accessMode ?? "readonly";
10
+ return ` - ${m.path} (${m.module.name}, ${mode})`;
11
+ });
12
+ return { messages: [{
13
+ role: "user",
14
+ content: {
15
+ type: "text",
16
+ text: `# AFS Explorer Guide
17
+
18
+ AFS (Agentic File System) provides a unified interface to access various data sources.
19
+ Use these tools to navigate and interact with the mounted providers:
20
+
21
+ ## Available Tools
22
+
23
+ - **afs_list** — List directory contents at a path. Start with \`afs_list /\` to see all mount points.
24
+ - **afs_read** — Read the content of a file or entry.
25
+ - **afs_stat** — Get metadata (size, type, children count) for any path.
26
+ - **afs_search** — Search for content within a path subtree.
27
+ - **afs_explain** — Get a human-readable explanation of a path or topic.
28
+ - **afs_write** — Write content to a path (if the provider supports it).
29
+ - **afs_delete** — Delete a file or directory.
30
+ - **afs_exec** — Execute an action. Use \`afs_list {path}/.actions\` to discover available actions.
31
+
32
+ ## Getting Started
33
+
34
+ 1. Run \`afs_list /\` to see all mount points
35
+ 2. Pick a mount and run \`afs_list /mount-path\` to explore its contents
36
+ 3. Use \`afs_read\` to view files, \`afs_stat\` for metadata
37
+ 4. Use \`afs_list {path}/.actions\` to discover executable actions
38
+ 5. Mount new providers: \`afs_exec /.actions/mount {uri, path}\` or via registry \`afs_exec /registry/.../.actions/mount\`
39
+ 6. Unmount providers: \`afs_exec /.actions/unmount {path}\`
40
+
41
+ ${mountList.length > 0 ? `## Current Mounts\n\n${mountList.join("\n")}` : "## Current Mounts\n\nNo providers are currently mounted."}`
42
+ }
43
+ }] };
44
+ });
45
+ }
46
+
47
+ //#endregion
48
+ exports.registerPrompts = registerPrompts;