@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.
- package/README.md +262 -15
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/_virtual/rolldown_runtime.mjs +7 -0
- package/dist/cli.cjs +40 -0
- package/dist/cli.d.cts +2 -0
- package/dist/cli.d.mts +2 -1
- package/dist/cli.mjs +36 -24
- package/dist/cli.mjs.map +1 -0
- package/dist/config/afs-loader.cjs +578 -0
- package/dist/config/afs-loader.d.cts +19 -0
- package/dist/config/afs-loader.d.cts.map +1 -0
- package/dist/config/afs-loader.d.mts +19 -0
- package/dist/config/afs-loader.d.mts.map +1 -0
- package/dist/config/afs-loader.mjs +576 -0
- package/dist/config/afs-loader.mjs.map +1 -0
- package/dist/config/env.cjs +46 -0
- package/dist/config/env.mjs +46 -0
- package/dist/config/env.mjs.map +1 -0
- package/dist/config/loader.cjs +219 -0
- package/dist/config/loader.mjs +217 -0
- package/dist/config/loader.mjs.map +1 -0
- package/dist/config/mount-commands.cjs +226 -0
- package/dist/config/mount-commands.d.cts +14 -0
- package/dist/config/mount-commands.d.cts.map +1 -0
- package/dist/config/mount-commands.d.mts +14 -0
- package/dist/config/mount-commands.d.mts.map +1 -0
- package/dist/config/mount-commands.mjs +220 -0
- package/dist/config/mount-commands.mjs.map +1 -0
- package/dist/config/schema.cjs +99 -0
- package/dist/config/schema.mjs +98 -0
- package/dist/config/schema.mjs.map +1 -0
- package/dist/core/commands/delete.cjs +41 -0
- package/dist/core/commands/delete.d.cts +18 -0
- package/dist/core/commands/delete.d.cts.map +1 -0
- package/dist/core/commands/delete.d.mts +18 -0
- package/dist/core/commands/delete.d.mts.map +1 -0
- package/dist/core/commands/delete.mjs +42 -0
- package/dist/core/commands/delete.mjs.map +1 -0
- package/dist/core/commands/exec.cjs +98 -0
- package/dist/core/commands/exec.d.cts +26 -0
- package/dist/core/commands/exec.d.cts.map +1 -0
- package/dist/core/commands/exec.d.mts +26 -0
- package/dist/core/commands/exec.d.mts.map +1 -0
- package/dist/core/commands/exec.mjs +99 -0
- package/dist/core/commands/exec.mjs.map +1 -0
- package/dist/core/commands/explain.cjs +278 -0
- package/dist/core/commands/explain.d.cts +25 -0
- package/dist/core/commands/explain.d.cts.map +1 -0
- package/dist/core/commands/explain.d.mts +25 -0
- package/dist/core/commands/explain.d.mts.map +1 -0
- package/dist/core/commands/explain.mjs +279 -0
- package/dist/core/commands/explain.mjs.map +1 -0
- package/dist/core/commands/explore.cjs +30 -0
- package/dist/core/commands/explore.d.mts +2 -0
- package/dist/core/commands/explore.mjs +31 -0
- package/dist/core/commands/explore.mjs.map +1 -0
- package/dist/core/commands/index.cjs +36 -0
- package/dist/core/commands/index.d.cts +21 -0
- package/dist/core/commands/index.d.cts.map +1 -0
- package/dist/core/commands/index.d.mts +24 -0
- package/dist/core/commands/index.d.mts.map +1 -0
- package/dist/core/commands/index.mjs +37 -0
- package/dist/core/commands/index.mjs.map +1 -0
- package/dist/core/commands/ls.cjs +57 -0
- package/dist/core/commands/ls.d.cts +21 -0
- package/dist/core/commands/ls.d.cts.map +1 -0
- package/dist/core/commands/ls.d.mts +21 -0
- package/dist/core/commands/ls.d.mts.map +1 -0
- package/dist/core/commands/ls.mjs +58 -0
- package/dist/core/commands/ls.mjs.map +1 -0
- package/dist/core/commands/mount.cjs +222 -0
- package/dist/core/commands/mount.d.cts +35 -0
- package/dist/core/commands/mount.d.cts.map +1 -0
- package/dist/core/commands/mount.d.mts +35 -0
- package/dist/core/commands/mount.d.mts.map +1 -0
- package/dist/core/commands/mount.mjs +223 -0
- package/dist/core/commands/mount.mjs.map +1 -0
- package/dist/core/commands/read.cjs +48 -0
- package/dist/core/commands/read.d.cts +17 -0
- package/dist/core/commands/read.d.cts.map +1 -0
- package/dist/core/commands/read.d.mts +17 -0
- package/dist/core/commands/read.d.mts.map +1 -0
- package/dist/core/commands/read.mjs +49 -0
- package/dist/core/commands/read.mjs.map +1 -0
- package/dist/core/commands/search.cjs +40 -0
- package/dist/core/commands/search.d.mts +2 -0
- package/dist/core/commands/search.mjs +41 -0
- package/dist/core/commands/search.mjs.map +1 -0
- package/dist/core/commands/serve.cjs +267 -0
- package/dist/core/commands/serve.d.mts +2 -0
- package/dist/core/commands/serve.mjs +267 -0
- package/dist/core/commands/serve.mjs.map +1 -0
- package/dist/core/commands/stat.cjs +53 -0
- package/dist/core/commands/stat.d.cts +17 -0
- package/dist/core/commands/stat.d.cts.map +1 -0
- package/dist/core/commands/stat.d.mts +17 -0
- package/dist/core/commands/stat.d.mts.map +1 -0
- package/dist/core/commands/stat.mjs +54 -0
- package/dist/core/commands/stat.mjs.map +1 -0
- package/dist/core/commands/types.cjs +18 -0
- package/dist/core/commands/types.d.cts +54 -0
- package/dist/core/commands/types.d.cts.map +1 -0
- package/dist/core/commands/types.d.mts +54 -0
- package/dist/core/commands/types.d.mts.map +1 -0
- package/dist/core/commands/types.mjs +19 -0
- package/dist/core/commands/types.mjs.map +1 -0
- package/dist/core/commands/write.cjs +70 -0
- package/dist/core/commands/write.d.cts +20 -0
- package/dist/core/commands/write.d.cts.map +1 -0
- package/dist/core/commands/write.d.mts +20 -0
- package/dist/core/commands/write.d.mts.map +1 -0
- package/dist/core/commands/write.mjs +71 -0
- package/dist/core/commands/write.mjs.map +1 -0
- package/dist/core/executor/index.cjs +196 -0
- package/dist/core/executor/index.d.cts +77 -0
- package/dist/core/executor/index.d.cts.map +1 -0
- package/dist/core/executor/index.d.mts +77 -0
- package/dist/core/executor/index.d.mts.map +1 -0
- package/dist/core/executor/index.mjs +195 -0
- package/dist/core/executor/index.mjs.map +1 -0
- package/dist/core/formatters/delete.cjs +37 -0
- package/dist/core/formatters/delete.d.cts +18 -0
- package/dist/core/formatters/delete.d.cts.map +1 -0
- package/dist/core/formatters/delete.d.mts +18 -0
- package/dist/core/formatters/delete.d.mts.map +1 -0
- package/dist/core/formatters/delete.mjs +37 -0
- package/dist/core/formatters/delete.mjs.map +1 -0
- package/dist/core/formatters/exec.cjs +60 -0
- package/dist/core/formatters/exec.d.cts +18 -0
- package/dist/core/formatters/exec.d.cts.map +1 -0
- package/dist/core/formatters/exec.d.mts +18 -0
- package/dist/core/formatters/exec.d.mts.map +1 -0
- package/dist/core/formatters/exec.mjs +60 -0
- package/dist/core/formatters/exec.mjs.map +1 -0
- package/dist/core/formatters/explain.cjs +99 -0
- package/dist/core/formatters/explain.d.cts +11 -0
- package/dist/core/formatters/explain.d.cts.map +1 -0
- package/dist/core/formatters/explain.d.mts +11 -0
- package/dist/core/formatters/explain.d.mts.map +1 -0
- package/dist/core/formatters/explain.mjs +98 -0
- package/dist/core/formatters/explain.mjs.map +1 -0
- package/dist/core/formatters/index.d.mts +9 -0
- package/dist/core/formatters/ls.cjs +179 -0
- package/dist/core/formatters/ls.d.cts +20 -0
- package/dist/core/formatters/ls.d.cts.map +1 -0
- package/dist/core/formatters/ls.d.mts +20 -0
- package/dist/core/formatters/ls.d.mts.map +1 -0
- package/dist/core/formatters/ls.mjs +179 -0
- package/dist/core/formatters/ls.mjs.map +1 -0
- package/dist/core/formatters/mount.cjs +55 -0
- package/dist/core/formatters/mount.d.cts +15 -0
- package/dist/core/formatters/mount.d.cts.map +1 -0
- package/dist/core/formatters/mount.d.mts +15 -0
- package/dist/core/formatters/mount.d.mts.map +1 -0
- package/dist/core/formatters/mount.mjs +55 -0
- package/dist/core/formatters/mount.mjs.map +1 -0
- package/dist/core/formatters/read.cjs +100 -0
- package/dist/core/formatters/read.d.cts +22 -0
- package/dist/core/formatters/read.d.cts.map +1 -0
- package/dist/core/formatters/read.d.mts +22 -0
- package/dist/core/formatters/read.d.mts.map +1 -0
- package/dist/core/formatters/read.mjs +100 -0
- package/dist/core/formatters/read.mjs.map +1 -0
- package/dist/core/formatters/search.cjs +44 -0
- package/dist/core/formatters/search.d.mts +1 -0
- package/dist/core/formatters/search.mjs +44 -0
- package/dist/core/formatters/search.mjs.map +1 -0
- package/dist/core/formatters/stat.cjs +155 -0
- package/dist/core/formatters/stat.d.cts +15 -0
- package/dist/core/formatters/stat.d.cts.map +1 -0
- package/dist/core/formatters/stat.d.mts +15 -0
- package/dist/core/formatters/stat.d.mts.map +1 -0
- package/dist/core/formatters/stat.mjs +155 -0
- package/dist/core/formatters/stat.mjs.map +1 -0
- package/dist/core/formatters/write.cjs +51 -0
- package/dist/core/formatters/write.d.cts +22 -0
- package/dist/core/formatters/write.d.cts.map +1 -0
- package/dist/core/formatters/write.d.mts +22 -0
- package/dist/core/formatters/write.d.mts.map +1 -0
- package/dist/core/formatters/write.mjs +51 -0
- package/dist/core/formatters/write.mjs.map +1 -0
- package/dist/core/helpers/exec-args.cjs +142 -0
- package/dist/core/helpers/exec-args.d.cts +46 -0
- package/dist/core/helpers/exec-args.d.cts.map +1 -0
- package/dist/core/helpers/exec-args.d.mts +46 -0
- package/dist/core/helpers/exec-args.d.mts.map +1 -0
- package/dist/core/helpers/exec-args.mjs +139 -0
- package/dist/core/helpers/exec-args.mjs.map +1 -0
- package/dist/core/helpers/stdin.cjs +41 -0
- package/dist/core/helpers/stdin.d.cts +15 -0
- package/dist/core/helpers/stdin.d.cts.map +1 -0
- package/dist/core/helpers/stdin.d.mts +15 -0
- package/dist/core/helpers/stdin.d.mts.map +1 -0
- package/dist/core/helpers/stdin.mjs +41 -0
- package/dist/core/helpers/stdin.mjs.map +1 -0
- package/dist/core/index.cjs +49 -0
- package/dist/core/index.d.cts +24 -0
- package/dist/core/index.d.mts +25 -0
- package/dist/core/index.mjs +24 -0
- package/dist/core/path-utils.cjs +1 -0
- package/dist/core/path-utils.mjs +3 -0
- package/dist/core/types.d.cts +24 -0
- package/dist/core/types.d.cts.map +1 -0
- package/dist/core/types.d.mts +24 -0
- package/dist/core/types.d.mts.map +1 -0
- package/dist/credential/auth-server.cjs +247 -0
- package/dist/credential/auth-server.mjs +247 -0
- package/dist/credential/auth-server.mjs.map +1 -0
- package/dist/credential/cli-auth-context.cjs +86 -0
- package/dist/credential/cli-auth-context.d.mts +1 -0
- package/dist/credential/cli-auth-context.mjs +86 -0
- package/dist/credential/cli-auth-context.mjs.map +1 -0
- package/dist/credential/index.cjs +5 -0
- package/dist/credential/index.d.mts +4 -0
- package/dist/credential/index.mjs +7 -0
- package/dist/credential/mcp-auth-context.cjs +186 -0
- package/dist/credential/mcp-auth-context.d.mts +1 -0
- package/dist/credential/mcp-auth-context.mjs +186 -0
- package/dist/credential/mcp-auth-context.mjs.map +1 -0
- package/dist/credential/resolver.cjs +127 -0
- package/dist/credential/resolver.d.mts +1 -0
- package/dist/credential/resolver.mjs +127 -0
- package/dist/credential/resolver.mjs.map +1 -0
- package/dist/credential/store.cjs +106 -0
- package/dist/credential/store.d.cts +30 -0
- package/dist/credential/store.d.cts.map +1 -0
- package/dist/credential/store.d.mts +30 -0
- package/dist/credential/store.d.mts.map +1 -0
- package/dist/credential/store.mjs +106 -0
- package/dist/credential/store.mjs.map +1 -0
- package/dist/errors.cjs +18 -0
- package/dist/errors.mjs +18 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/explorer/actions.cjs +311 -0
- package/dist/explorer/actions.mjs +305 -0
- package/dist/explorer/actions.mjs.map +1 -0
- package/dist/explorer/components/dialog.cjs +508 -0
- package/dist/explorer/components/dialog.mjs +509 -0
- package/dist/explorer/components/dialog.mjs.map +1 -0
- package/dist/explorer/components/file-list.cjs +107 -0
- package/dist/explorer/components/file-list.mjs +107 -0
- package/dist/explorer/components/file-list.mjs.map +1 -0
- package/dist/explorer/components/function-bar.cjs +55 -0
- package/dist/explorer/components/function-bar.mjs +55 -0
- package/dist/explorer/components/function-bar.mjs.map +1 -0
- package/dist/explorer/components/index.cjs +5 -0
- package/dist/explorer/components/index.mjs +7 -0
- package/dist/explorer/components/metadata-panel.cjs +219 -0
- package/dist/explorer/components/metadata-panel.mjs +219 -0
- package/dist/explorer/components/metadata-panel.mjs.map +1 -0
- package/dist/explorer/components/status-bar.cjs +53 -0
- package/dist/explorer/components/status-bar.mjs +54 -0
- package/dist/explorer/components/status-bar.mjs.map +1 -0
- package/dist/explorer/keybindings.cjs +214 -0
- package/dist/explorer/keybindings.mjs +213 -0
- package/dist/explorer/keybindings.mjs.map +1 -0
- package/dist/explorer/screen.cjs +251 -0
- package/dist/explorer/screen.d.cts +23 -0
- package/dist/explorer/screen.d.cts.map +1 -0
- package/dist/explorer/screen.d.mts +23 -0
- package/dist/explorer/screen.d.mts.map +1 -0
- package/dist/explorer/screen.mjs +250 -0
- package/dist/explorer/screen.mjs.map +1 -0
- package/dist/explorer/state.cjs +53 -0
- package/dist/explorer/state.mjs +53 -0
- package/dist/explorer/state.mjs.map +1 -0
- package/dist/explorer/theme.cjs +160 -0
- package/dist/explorer/theme.mjs +157 -0
- package/dist/explorer/theme.mjs.map +1 -0
- package/dist/index.cjs +12 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.mts +7 -4
- package/dist/index.mjs +7 -2
- package/dist/mcp/http-transport.cjs +87 -0
- package/dist/mcp/http-transport.mjs +87 -0
- package/dist/mcp/http-transport.mjs.map +1 -0
- package/dist/mcp/prompts.cjs +48 -0
- package/dist/mcp/prompts.mjs +48 -0
- package/dist/mcp/prompts.mjs.map +1 -0
- package/dist/mcp/resources.cjs +25 -0
- package/dist/mcp/resources.mjs +25 -0
- package/dist/mcp/resources.mjs.map +1 -0
- package/dist/mcp/server.cjs +74 -0
- package/dist/mcp/server.mjs +73 -0
- package/dist/mcp/server.mjs.map +1 -0
- package/dist/mcp/tools.cjs +152 -0
- package/dist/mcp/tools.mjs +152 -0
- package/dist/mcp/tools.mjs.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts +10 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts +10 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts +46 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts +46 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.cjs +902 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs +902 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.cjs +6 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs +8 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs.map +1 -0
- package/dist/path-utils.cjs +105 -0
- package/dist/path-utils.d.cts +50 -0
- package/dist/path-utils.d.cts.map +1 -0
- package/dist/path-utils.d.mts +50 -0
- package/dist/path-utils.d.mts.map +1 -0
- package/dist/path-utils.mjs +104 -0
- package/dist/path-utils.mjs.map +1 -0
- package/dist/repl.cjs +491 -0
- package/dist/repl.d.cts +15 -0
- package/dist/repl.d.cts.map +1 -0
- package/dist/repl.d.mts +16 -0
- package/dist/repl.d.mts.map +1 -0
- package/dist/repl.mjs +491 -0
- package/dist/repl.mjs.map +1 -0
- package/dist/serve.cjs +146 -0
- package/dist/serve.d.cts +41 -0
- package/dist/serve.d.cts.map +1 -0
- package/dist/serve.d.mts +41 -0
- package/dist/serve.d.mts.map +1 -0
- package/dist/serve.mjs +146 -0
- package/dist/serve.mjs.map +1 -0
- package/dist/ui/header.cjs +12 -0
- package/dist/ui/header.mjs +13 -0
- package/dist/ui/header.mjs.map +1 -0
- package/dist/ui/index.cjs +8 -0
- package/dist/ui/index.mjs +9 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/ui/terminal.cjs +88 -0
- package/dist/ui/terminal.mjs +88 -0
- package/dist/ui/terminal.mjs.map +1 -0
- package/dist/version.cjs +9 -0
- package/dist/version.d.cts +5 -0
- package/dist/version.d.cts.map +1 -0
- package/dist/version.d.mts +5 -0
- package/dist/version.d.mts.map +1 -0
- package/dist/version.mjs +9 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +77 -11
- package/.turbo/turbo-build.log +0 -18
- package/.turbo/turbo-check-types.log +0 -4
- package/dist/version--p6A8sKX.mjs +0 -5
- package/src/cli.test.ts +0 -8
- package/src/cli.ts +0 -29
- package/src/index.ts +0 -7
- package/src/version.ts +0 -1
- 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;
|
package/dist/index.d.cts
ADDED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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 {
|
|
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;
|