@fnndsc/brasa 0.1.0
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/dist/builtins/debug.d.ts +8 -0
- package/dist/builtins/debug.js +39 -0
- package/dist/builtins/debug.js.map +1 -0
- package/dist/builtins/executable.d.ts +22 -0
- package/dist/builtins/executable.js +115 -0
- package/dist/builtins/executable.js.map +1 -0
- package/dist/builtins/fs/cat.d.ts +16 -0
- package/dist/builtins/fs/cat.js +266 -0
- package/dist/builtins/fs/cat.js.map +1 -0
- package/dist/builtins/fs/cd.d.ts +42 -0
- package/dist/builtins/fs/cd.js +193 -0
- package/dist/builtins/fs/cd.js.map +1 -0
- package/dist/builtins/fs/cp.d.ts +10 -0
- package/dist/builtins/fs/cp.js +86 -0
- package/dist/builtins/fs/cp.js.map +1 -0
- package/dist/builtins/fs/download.d.ts +6 -0
- package/dist/builtins/fs/download.js +45 -0
- package/dist/builtins/fs/download.js.map +1 -0
- package/dist/builtins/fs/du.d.ts +58 -0
- package/dist/builtins/fs/du.js +210 -0
- package/dist/builtins/fs/du.js.map +1 -0
- package/dist/builtins/fs/edit.d.ts +7 -0
- package/dist/builtins/fs/edit.js +104 -0
- package/dist/builtins/fs/edit.js.map +1 -0
- package/dist/builtins/fs/ls.d.ts +8 -0
- package/dist/builtins/fs/ls.js +68 -0
- package/dist/builtins/fs/ls.js.map +1 -0
- package/dist/builtins/fs/mkdir.d.ts +9 -0
- package/dist/builtins/fs/mkdir.js +52 -0
- package/dist/builtins/fs/mkdir.js.map +1 -0
- package/dist/builtins/fs/mv.d.ts +10 -0
- package/dist/builtins/fs/mv.js +88 -0
- package/dist/builtins/fs/mv.js.map +1 -0
- package/dist/builtins/fs/pull.args.d.ts +22 -0
- package/dist/builtins/fs/pull.args.js +30 -0
- package/dist/builtins/fs/pull.args.js.map +1 -0
- package/dist/builtins/fs/pull.d.ts +26 -0
- package/dist/builtins/fs/pull.js +445 -0
- package/dist/builtins/fs/pull.js.map +1 -0
- package/dist/builtins/fs/pwd.d.ts +10 -0
- package/dist/builtins/fs/pwd.js +73 -0
- package/dist/builtins/fs/pwd.js.map +1 -0
- package/dist/builtins/fs/rm.d.ts +37 -0
- package/dist/builtins/fs/rm.js +197 -0
- package/dist/builtins/fs/rm.js.map +1 -0
- package/dist/builtins/fs/touch.d.ts +9 -0
- package/dist/builtins/fs/touch.js +76 -0
- package/dist/builtins/fs/touch.js.map +1 -0
- package/dist/builtins/fs/tree.d.ts +15 -0
- package/dist/builtins/fs/tree.js +84 -0
- package/dist/builtins/fs/tree.js.map +1 -0
- package/dist/builtins/fs/upload.d.ts +6 -0
- package/dist/builtins/fs/upload.js +48 -0
- package/dist/builtins/fs/upload.js.map +1 -0
- package/dist/builtins/help.d.ts +74 -0
- package/dist/builtins/help.js +1217 -0
- package/dist/builtins/help.js.map +1 -0
- package/dist/builtins/index.d.ts +45 -0
- package/dist/builtins/index.js +45 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/net/connect.d.ts +7 -0
- package/dist/builtins/net/connect.js +42 -0
- package/dist/builtins/net/connect.js.map +1 -0
- package/dist/builtins/net/cubepath.d.ts +18 -0
- package/dist/builtins/net/cubepath.js +102 -0
- package/dist/builtins/net/cubepath.js.map +1 -0
- package/dist/builtins/net/logout.d.ts +6 -0
- package/dist/builtins/net/logout.js +24 -0
- package/dist/builtins/net/logout.js.map +1 -0
- package/dist/builtins/net/pacs.d.ts +24 -0
- package/dist/builtins/net/pacs.js +121 -0
- package/dist/builtins/net/pacs.js.map +1 -0
- package/dist/builtins/net/pacsUtils.d.ts +85 -0
- package/dist/builtins/net/pacsUtils.js +184 -0
- package/dist/builtins/net/pacsUtils.js.map +1 -0
- package/dist/builtins/net/query.d.ts +60 -0
- package/dist/builtins/net/query.js +324 -0
- package/dist/builtins/net/query.js.map +1 -0
- package/dist/builtins/parametersofplugin.d.ts +13 -0
- package/dist/builtins/parametersofplugin.js +43 -0
- package/dist/builtins/parametersofplugin.js.map +1 -0
- package/dist/builtins/pluginExecute.d.ts +27 -0
- package/dist/builtins/pluginExecute.js +165 -0
- package/dist/builtins/pluginExecute.js.map +1 -0
- package/dist/builtins/proc.d.ts +6 -0
- package/dist/builtins/proc.helpers.d.ts +68 -0
- package/dist/builtins/proc.helpers.js +102 -0
- package/dist/builtins/proc.helpers.js.map +1 -0
- package/dist/builtins/proc.js +289 -0
- package/dist/builtins/proc.js.map +1 -0
- package/dist/builtins/res/compute.d.ts +6 -0
- package/dist/builtins/res/compute.js +55 -0
- package/dist/builtins/res/compute.js.map +1 -0
- package/dist/builtins/res/feed.d.ts +6 -0
- package/dist/builtins/res/feed.js +244 -0
- package/dist/builtins/res/feed.js.map +1 -0
- package/dist/builtins/res/feed.notes.d.ts +28 -0
- package/dist/builtins/res/feed.notes.js +24 -0
- package/dist/builtins/res/feed.notes.js.map +1 -0
- package/dist/builtins/res/files.d.ts +18 -0
- package/dist/builtins/res/files.js +85 -0
- package/dist/builtins/res/files.js.map +1 -0
- package/dist/builtins/res/group.d.ts +6 -0
- package/dist/builtins/res/group.js +54 -0
- package/dist/builtins/res/group.js.map +1 -0
- package/dist/builtins/res/pipeline.args.d.ts +22 -0
- package/dist/builtins/res/pipeline.args.js +28 -0
- package/dist/builtins/res/pipeline.args.js.map +1 -0
- package/dist/builtins/res/pipeline.d.ts +20 -0
- package/dist/builtins/res/pipeline.js +252 -0
- package/dist/builtins/res/pipeline.js.map +1 -0
- package/dist/builtins/res/plugin.d.ts +13 -0
- package/dist/builtins/res/plugin.js +140 -0
- package/dist/builtins/res/plugin.js.map +1 -0
- package/dist/builtins/res/plugininstance.d.ts +6 -0
- package/dist/builtins/res/plugininstance.js +53 -0
- package/dist/builtins/res/plugininstance.js.map +1 -0
- package/dist/builtins/res/pluginmeta.d.ts +6 -0
- package/dist/builtins/res/pluginmeta.js +53 -0
- package/dist/builtins/res/pluginmeta.js.map +1 -0
- package/dist/builtins/res/tag.d.ts +6 -0
- package/dist/builtins/res/tag.js +53 -0
- package/dist/builtins/res/tag.js.map +1 -0
- package/dist/builtins/res/workflow.d.ts +6 -0
- package/dist/builtins/res/workflow.js +53 -0
- package/dist/builtins/res/workflow.js.map +1 -0
- package/dist/builtins/store.d.ts +6 -0
- package/dist/builtins/store.js +107 -0
- package/dist/builtins/store.js.map +1 -0
- package/dist/builtins/sys/context.d.ts +6 -0
- package/dist/builtins/sys/context.js +50 -0
- package/dist/builtins/sys/context.js.map +1 -0
- package/dist/builtins/sys/physicalmode.d.ts +8 -0
- package/dist/builtins/sys/physicalmode.js +34 -0
- package/dist/builtins/sys/physicalmode.js.map +1 -0
- package/dist/builtins/sys/timing.d.ts +8 -0
- package/dist/builtins/sys/timing.js +34 -0
- package/dist/builtins/sys/timing.js.map +1 -0
- package/dist/builtins/sys/version.d.ts +15 -0
- package/dist/builtins/sys/version.js +23 -0
- package/dist/builtins/sys/version.js.map +1 -0
- package/dist/builtins/sys/whoami.d.ts +17 -0
- package/dist/builtins/sys/whoami.js +44 -0
- package/dist/builtins/sys/whoami.js.map +1 -0
- package/dist/builtins/utils.d.ts +55 -0
- package/dist/builtins/utils.js +145 -0
- package/dist/builtins/utils.js.map +1 -0
- package/dist/builtins/wildcard.d.ts +26 -0
- package/dist/builtins/wildcard.js +120 -0
- package/dist/builtins/wildcard.js.map +1 -0
- package/dist/command-keys.d.ts +8 -0
- package/dist/command-keys.js +32 -0
- package/dist/command-keys.js.map +1 -0
- package/dist/config/storeConfig.d.ts +57 -0
- package/dist/config/storeConfig.js +78 -0
- package/dist/config/storeConfig.js.map +1 -0
- package/dist/core/chiliDelegate.d.ts +21 -0
- package/dist/core/chiliDelegate.js +32 -0
- package/dist/core/chiliDelegate.js.map +1 -0
- package/dist/core/connect.d.ts +38 -0
- package/dist/core/connect.js +46 -0
- package/dist/core/connect.js.map +1 -0
- package/dist/core/dispatch.d.ts +95 -0
- package/dist/core/dispatch.js +618 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/engine.d.ts +91 -0
- package/dist/core/engine.js +222 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/preprocess.d.ts +46 -0
- package/dist/core/preprocess.js +146 -0
- package/dist/core/preprocess.js.map +1 -0
- package/dist/core/progress.d.ts +50 -0
- package/dist/core/progress.js +21 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/promptContext.d.ts +49 -0
- package/dist/core/promptContext.js +39 -0
- package/dist/core/promptContext.js.map +1 -0
- package/dist/core/question.d.ts +27 -0
- package/dist/core/question.js +33 -0
- package/dist/core/question.js.map +1 -0
- package/dist/core/sink.d.ts +207 -0
- package/dist/core/sink.js +329 -0
- package/dist/core/sink.js.map +1 -0
- package/dist/core/surface.d.ts +172 -0
- package/dist/core/surface.js +105 -0
- package/dist/core/surface.js.map +1 -0
- package/dist/core/version.d.ts +20 -0
- package/dist/core/version.js +82 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/completer/index.d.ts +15 -0
- package/dist/lib/completer/index.js +212 -0
- package/dist/lib/completer/index.js.map +1 -0
- package/dist/lib/completer/pathComplete.helpers.d.ts +22 -0
- package/dist/lib/completer/pathComplete.helpers.js +49 -0
- package/dist/lib/completer/pathComplete.helpers.js.map +1 -0
- package/dist/lib/parser.d.ts +13 -0
- package/dist/lib/parser.js +52 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/pipe.d.ts +11 -0
- package/dist/lib/pipe.js +90 -0
- package/dist/lib/pipe.js.map +1 -0
- package/dist/lib/prefetch.d.ts +25 -0
- package/dist/lib/prefetch.js +64 -0
- package/dist/lib/prefetch.js.map +1 -0
- package/dist/lib/semicolonParser.d.ts +22 -0
- package/dist/lib/semicolonParser.js +53 -0
- package/dist/lib/semicolonParser.js.map +1 -0
- package/dist/lib/spinner.d.ts +23 -0
- package/dist/lib/spinner.js +71 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/vfs/providers/static.d.ts +65 -0
- package/dist/lib/vfs/providers/static.js +164 -0
- package/dist/lib/vfs/providers/static.js.map +1 -0
- package/dist/lib/vfs/providers/static_content.d.ts +27 -0
- package/dist/lib/vfs/providers/static_content.js +180 -0
- package/dist/lib/vfs/providers/static_content.js.map +1 -0
- package/dist/lib/vfs/vfs.d.ts +59 -0
- package/dist/lib/vfs/vfs.js +202 -0
- package/dist/lib/vfs/vfs.js.map +1 -0
- package/dist/session/index.d.ts +76 -0
- package/dist/session/index.js +120 -0
- package/dist/session/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin physicalmode command.
|
|
3
|
+
* Toggles physical filesystem mode, reported as a command envelope.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
7
|
+
import { session } from '../../session/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Toggles or displays physical filesystem mode.
|
|
10
|
+
*
|
|
11
|
+
* @param args - Command line arguments: 'on', 'off', or empty to display status.
|
|
12
|
+
* @returns An envelope describing the (possibly updated) physical mode state.
|
|
13
|
+
*/
|
|
14
|
+
export async function builtin_physicalmode(args) {
|
|
15
|
+
const subcommand = args[0];
|
|
16
|
+
if (!subcommand) {
|
|
17
|
+
const enabled = session.physicalMode_get();
|
|
18
|
+
const status = enabled ? 'enabled' : 'disabled';
|
|
19
|
+
const detail = enabled
|
|
20
|
+
? chalk.gray(' Paths are used directly without logical-to-physical mapping.')
|
|
21
|
+
: chalk.gray(' Paths are resolved through logical-to-physical mapping.');
|
|
22
|
+
return envelope_ok(`Physical filesystem mode: ${chalk.yellow(status)}\n${detail}\n${chalk.gray('\nUsage: physicalmode [on|off]')}\n`, { kind: 'sys.physicalMode', data: { enabled } });
|
|
23
|
+
}
|
|
24
|
+
if (subcommand === 'on') {
|
|
25
|
+
session.physicalMode_set(true);
|
|
26
|
+
return envelope_ok(`${chalk.yellow('[!] Physical filesystem mode enabled')}\n${chalk.gray(' Paths will be used directly without logical-to-physical mapping.')}\n`, { kind: 'sys.physicalMode', data: { enabled: true } });
|
|
27
|
+
}
|
|
28
|
+
if (subcommand === 'off') {
|
|
29
|
+
session.physicalMode_set(false);
|
|
30
|
+
return envelope_ok(`${chalk.green('[+] Physical filesystem mode disabled')}\n${chalk.gray(' Paths will be resolved through logical-to-physical mapping.')}\n`, { kind: 'sys.physicalMode', data: { enabled: false } });
|
|
31
|
+
}
|
|
32
|
+
return envelope_error(`${chalk.red(`Unknown argument: ${subcommand}`)}\n${chalk.gray('Usage: physicalmode [on|off]')}\n`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=physicalmode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalmode.js","sourceRoot":"","sources":["../../../src/builtins/sys/physicalmode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAc;IACvD,MAAM,UAAU,GAAuB,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAY,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpD,MAAM,MAAM,GAAW,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QACxD,MAAM,MAAM,GAAW,OAAO;YAC5B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC;YAC9E,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC5E,OAAO,WAAW,CAChB,6BAA6B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,IAAI,EACjH,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,IAAI,EAClJ,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CACtD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,IAAI,EAC7I,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CACnG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
2
|
+
/**
|
|
3
|
+
* Toggles or displays command timing mode.
|
|
4
|
+
*
|
|
5
|
+
* @param args - Command line arguments: 'on', 'off', or empty to display status.
|
|
6
|
+
* @returns An envelope describing the (possibly updated) timing state.
|
|
7
|
+
*/
|
|
8
|
+
export declare function builtin_timing(args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin timing command.
|
|
3
|
+
* Toggles execution timing, reported as a command envelope.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
7
|
+
import { session } from '../../session/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Toggles or displays command timing mode.
|
|
10
|
+
*
|
|
11
|
+
* @param args - Command line arguments: 'on', 'off', or empty to display status.
|
|
12
|
+
* @returns An envelope describing the (possibly updated) timing state.
|
|
13
|
+
*/
|
|
14
|
+
export async function builtin_timing(args) {
|
|
15
|
+
const subcommand = args[0];
|
|
16
|
+
if (!subcommand) {
|
|
17
|
+
const enabled = session.timingEnabled_get();
|
|
18
|
+
const status = enabled ? 'enabled' : 'disabled';
|
|
19
|
+
const detail = enabled
|
|
20
|
+
? chalk.gray(' Execution times will be displayed after each command.')
|
|
21
|
+
: chalk.gray(' Execution times are hidden.');
|
|
22
|
+
return envelope_ok(`Command timing: ${chalk.yellow(status)}\n${detail}\n${chalk.gray('\nUsage: timing [on|off]')}\n`, { kind: 'sys.timing', data: { enabled } });
|
|
23
|
+
}
|
|
24
|
+
if (subcommand === 'on') {
|
|
25
|
+
session.timingEnabled_set(true);
|
|
26
|
+
return envelope_ok(`${chalk.green('[+] Command timing enabled')}\n${chalk.gray(' Execution times will be displayed after each command.')}\n`, { kind: 'sys.timing', data: { enabled: true } });
|
|
27
|
+
}
|
|
28
|
+
if (subcommand === 'off') {
|
|
29
|
+
session.timingEnabled_set(false);
|
|
30
|
+
return envelope_ok(`${chalk.gray('[-] Command timing disabled')}\n${chalk.gray(' Execution times will no longer be displayed.')}\n`, { kind: 'sys.timing', data: { enabled: false } });
|
|
31
|
+
}
|
|
32
|
+
return envelope_error(`${chalk.red(`Unknown argument: ${subcommand}`)}\n${chalk.gray('Usage: timing [on|off]')}\n`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../../src/builtins/sys/timing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,UAAU,GAAuB,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAY,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACrD,MAAM,MAAM,GAAW,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QACxD,MAAM,MAAM,GAAW,OAAO;YAC5B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC;YACvE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO,WAAW,CAChB,mBAAmB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,EACjG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAC1C,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,IAAI,EAC5H,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,IAAI,EACnH,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CACjD,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAC7F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin version.
|
|
3
|
+
* Reports the chell stack versions (chell plus the chili/salsa/cumin layers) as
|
|
4
|
+
* a command envelope — the in-shell counterpart of `chell --version`.
|
|
5
|
+
*/
|
|
6
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
7
|
+
/**
|
|
8
|
+
* Reports the version of chell and the sandwich layers it runs with — the same
|
|
9
|
+
* report as `chell --version`, available from inside the shell.
|
|
10
|
+
*
|
|
11
|
+
* @param _args - Unused.
|
|
12
|
+
* @returns An envelope carrying the multi-line version report and a typed model
|
|
13
|
+
* of each layer's version.
|
|
14
|
+
*/
|
|
15
|
+
export declare function builtin_version(_args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin version.
|
|
3
|
+
* Reports the chell stack versions (chell plus the chili/salsa/cumin layers) as
|
|
4
|
+
* a command envelope — the in-shell counterpart of `chell --version`.
|
|
5
|
+
*/
|
|
6
|
+
import { envelope_ok } from '@fnndsc/cumin';
|
|
7
|
+
import { versionReport_build, versions_get } from '../../core/version.js';
|
|
8
|
+
/**
|
|
9
|
+
* Reports the version of chell and the sandwich layers it runs with — the same
|
|
10
|
+
* report as `chell --version`, available from inside the shell.
|
|
11
|
+
*
|
|
12
|
+
* @param _args - Unused.
|
|
13
|
+
* @returns An envelope carrying the multi-line version report and a typed model
|
|
14
|
+
* of each layer's version.
|
|
15
|
+
*/
|
|
16
|
+
export async function builtin_version(_args) {
|
|
17
|
+
const versions = versions_get();
|
|
18
|
+
return envelope_ok(`${versionReport_build()}\n`, {
|
|
19
|
+
kind: 'sys.version',
|
|
20
|
+
data: versions,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/builtins/sys/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAmB,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AAE9F;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAe;IACnD,MAAM,QAAQ,GAAkB,YAAY,EAAE,CAAC;IAC/C,OAAO,WAAW,CAAC,GAAG,mBAAmB,EAAE,IAAI,EAAE;QAC/C,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
2
|
+
/**
|
|
3
|
+
* Reports the current authenticated ChRIS username.
|
|
4
|
+
*
|
|
5
|
+
* @param _args - Unused.
|
|
6
|
+
* @returns An envelope carrying the username, or an error envelope with a
|
|
7
|
+
* not-connected notice when no user is authenticated.
|
|
8
|
+
*/
|
|
9
|
+
export declare function builtin_whoami(_args: string[]): Promise<CommandEnvelope>;
|
|
10
|
+
/**
|
|
11
|
+
* Reports the current CUBE URI.
|
|
12
|
+
*
|
|
13
|
+
* @param _args - Unused.
|
|
14
|
+
* @returns An envelope carrying the CUBE URL, or an error envelope with a
|
|
15
|
+
* not-connected notice when no connection exists.
|
|
16
|
+
*/
|
|
17
|
+
export declare function builtin_whereami(_args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtins whoami and whereami.
|
|
3
|
+
* Quick single-line identity queries, reported as command envelopes.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { context_getSingle } from '@fnndsc/salsa';
|
|
7
|
+
import { envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
8
|
+
/**
|
|
9
|
+
* Reports the current authenticated ChRIS username.
|
|
10
|
+
*
|
|
11
|
+
* @param _args - Unused.
|
|
12
|
+
* @returns An envelope carrying the username, or an error envelope with a
|
|
13
|
+
* not-connected notice when no user is authenticated.
|
|
14
|
+
*/
|
|
15
|
+
export async function builtin_whoami(_args) {
|
|
16
|
+
const context = await context_getSingle();
|
|
17
|
+
if (context.user) {
|
|
18
|
+
return envelope_ok(`${chalk.cyan(context.user)}\n`, {
|
|
19
|
+
kind: 'session.identity',
|
|
20
|
+
data: { user: context.user },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return envelope_error(`${chalk.gray('(not connected)')}\n`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Reports the current CUBE URI.
|
|
28
|
+
*
|
|
29
|
+
* @param _args - Unused.
|
|
30
|
+
* @returns An envelope carrying the CUBE URL, or an error envelope with a
|
|
31
|
+
* not-connected notice when no connection exists.
|
|
32
|
+
*/
|
|
33
|
+
export async function builtin_whereami(_args) {
|
|
34
|
+
const context = await context_getSingle();
|
|
35
|
+
if (context.URL) {
|
|
36
|
+
return envelope_ok(`${chalk.blue(context.URL)}\n`, {
|
|
37
|
+
kind: 'session.cube',
|
|
38
|
+
data: { url: context.URL },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
return envelope_error(`${chalk.gray('(not connected)')}\n`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/builtins/sys/whoami.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAkC,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAe;IAClD,MAAM,OAAO,GAAkB,MAAM,iBAAiB,EAAE,CAAC;IACzD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YAClD,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,cAAc,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,MAAM,OAAO,GAAkB,MAAM,iBAAiB,EAAE,CAAC;IACzD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YACjD,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,cAAc,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structure for parsed command line arguments.
|
|
3
|
+
*/
|
|
4
|
+
export interface ParsedArgs {
|
|
5
|
+
_: string[];
|
|
6
|
+
[key: string]: string | boolean | string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parses raw argument strings into a structured object.
|
|
10
|
+
* Supports `--` as an end-of-options marker (everything after is treated as positional args).
|
|
11
|
+
*/
|
|
12
|
+
export declare function commandArgs_process(args: string[]): ParsedArgs;
|
|
13
|
+
/**
|
|
14
|
+
* Context required for path resolution.
|
|
15
|
+
*/
|
|
16
|
+
export interface PathContext {
|
|
17
|
+
user: string | null;
|
|
18
|
+
cwd: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolves a path argument, handling `~` expansion and relative paths.
|
|
22
|
+
* Pure function version that takes context as argument.
|
|
23
|
+
*
|
|
24
|
+
* @param inputPath - The path to resolve.
|
|
25
|
+
* @param context - User and CWD context.
|
|
26
|
+
* @returns The absolute path.
|
|
27
|
+
*/
|
|
28
|
+
export declare function path_resolvePure(inputPath: string, context: PathContext): string;
|
|
29
|
+
/**
|
|
30
|
+
* Resolves a path argument, handling `~` expansion and relative paths.
|
|
31
|
+
* @param inputPath - The path to resolve.
|
|
32
|
+
* @returns The absolute path.
|
|
33
|
+
*/
|
|
34
|
+
export declare function path_resolve(inputPath: string): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Resolves links in a path without using PathMapper (for physical mode).
|
|
37
|
+
* Checks each component to see if it's a link and follows it.
|
|
38
|
+
*
|
|
39
|
+
* @param targetPath - The path to resolve.
|
|
40
|
+
* @returns The resolved path with links followed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function path_resolveLinks(targetPath: string): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Strips the function name padding prefix from an error message if debug mode is disabled.
|
|
45
|
+
*
|
|
46
|
+
* @param message - The raw/enhanced error message from the ErrorStack.
|
|
47
|
+
* @returns The cleaned or original error message based on the debug configuration.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```
|
|
51
|
+
* const cleaned = error_stripDebugPrefix("[PacsVfsProvider.list ] | ls: error");
|
|
52
|
+
* // cleaned will be "ls: error" if debug mode is disabled
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function error_stripDebugPrefix(message: string): string;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin Utilities
|
|
3
|
+
* Pure functions for argument parsing and path resolution logic.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { context_getSingle } from '@fnndsc/salsa';
|
|
7
|
+
import { session } from '../session/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parses raw argument strings into a structured object.
|
|
10
|
+
* Supports `--` as an end-of-options marker (everything after is treated as positional args).
|
|
11
|
+
*/
|
|
12
|
+
export function commandArgs_process(args) {
|
|
13
|
+
const result = { _: [] };
|
|
14
|
+
let endOfOptions = false;
|
|
15
|
+
for (let i = 0; i < args.length; i++) {
|
|
16
|
+
const arg = args[i];
|
|
17
|
+
// Check for -- (end of options marker)
|
|
18
|
+
if (arg === '--') {
|
|
19
|
+
endOfOptions = true;
|
|
20
|
+
continue; // Skip the -- itself
|
|
21
|
+
}
|
|
22
|
+
// After --, everything is a positional argument
|
|
23
|
+
if (endOfOptions) {
|
|
24
|
+
result._.push(arg);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (arg.startsWith('--')) {
|
|
28
|
+
const key = arg.substring(2);
|
|
29
|
+
if (args[i + 1] && !args[i + 1].startsWith('-')) {
|
|
30
|
+
result[key] = args[i + 1];
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result[key] = true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (arg.startsWith('-') && arg.length > 1) {
|
|
38
|
+
const flags = arg.substring(1).split('');
|
|
39
|
+
flags.forEach(flag => result[flag] = true);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
result._.push(arg);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolves a path argument, handling `~` expansion and relative paths.
|
|
49
|
+
* Pure function version that takes context as argument.
|
|
50
|
+
*
|
|
51
|
+
* @param inputPath - The path to resolve.
|
|
52
|
+
* @param context - User and CWD context.
|
|
53
|
+
* @returns The absolute path.
|
|
54
|
+
*/
|
|
55
|
+
export function path_resolvePure(inputPath, context) {
|
|
56
|
+
let resolved = inputPath;
|
|
57
|
+
const { user, cwd } = context;
|
|
58
|
+
if (inputPath.startsWith('~')) {
|
|
59
|
+
const home = user ? `/home/${user}` : '/';
|
|
60
|
+
if (inputPath === '~' || inputPath === '~/') {
|
|
61
|
+
resolved = home;
|
|
62
|
+
}
|
|
63
|
+
else if (inputPath.startsWith('~/')) {
|
|
64
|
+
resolved = path.posix.join(home, inputPath.substring(2));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!resolved.startsWith('/')) {
|
|
68
|
+
resolved = path.posix.resolve(cwd, resolved);
|
|
69
|
+
}
|
|
70
|
+
// Normalize
|
|
71
|
+
if (resolved.length > 1 && resolved.endsWith('/')) {
|
|
72
|
+
resolved = resolved.slice(0, -1);
|
|
73
|
+
}
|
|
74
|
+
return resolved;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolves a path argument, handling `~` expansion and relative paths.
|
|
78
|
+
* @param inputPath - The path to resolve.
|
|
79
|
+
* @returns The absolute path.
|
|
80
|
+
*/
|
|
81
|
+
export async function path_resolve(inputPath) {
|
|
82
|
+
const context = await context_getSingle();
|
|
83
|
+
const user = context.user;
|
|
84
|
+
const cwd = await session.getCWD();
|
|
85
|
+
return path_resolvePure(inputPath, { user, cwd });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolves links in a path without using PathMapper (for physical mode).
|
|
89
|
+
* Checks each component to see if it's a link and follows it.
|
|
90
|
+
*
|
|
91
|
+
* @param targetPath - The path to resolve.
|
|
92
|
+
* @returns The resolved path with links followed.
|
|
93
|
+
*/
|
|
94
|
+
export async function path_resolveLinks(targetPath) {
|
|
95
|
+
// We need to dynamically import files_list to avoid circular dependency
|
|
96
|
+
// because builtins/fs/ls.ts imports path_resolve from here
|
|
97
|
+
const { files_list } = await import('@fnndsc/chili/commands/fs/ls.js');
|
|
98
|
+
const components = targetPath.split('/').filter(c => c);
|
|
99
|
+
let currentPath = '';
|
|
100
|
+
for (const component of components) {
|
|
101
|
+
const parentPath = currentPath || '/';
|
|
102
|
+
currentPath = `${currentPath}/${component}`;
|
|
103
|
+
try {
|
|
104
|
+
// List parent directory to check if component is a link
|
|
105
|
+
const items = await files_list({ path: parentPath }, parentPath);
|
|
106
|
+
// Find the component in the listing
|
|
107
|
+
const item = items.find((i) => i.name === component);
|
|
108
|
+
if (item && item.type === 'link' && item.target) {
|
|
109
|
+
// Component is a link - resolve it
|
|
110
|
+
if (item.target.startsWith('/')) {
|
|
111
|
+
// Absolute link target
|
|
112
|
+
currentPath = item.target;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Relative link target
|
|
116
|
+
currentPath = `${parentPath}/${item.target}`.replace('//', '/');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (_error) {
|
|
121
|
+
// If we can't list the directory, continue with the current path
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return currentPath || '/';
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Strips the function name padding prefix from an error message if debug mode is disabled.
|
|
129
|
+
*
|
|
130
|
+
* @param message - The raw/enhanced error message from the ErrorStack.
|
|
131
|
+
* @returns The cleaned or original error message based on the debug configuration.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```
|
|
135
|
+
* const cleaned = error_stripDebugPrefix("[PacsVfsProvider.list ] | ls: error");
|
|
136
|
+
* // cleaned will be "ls: error" if debug mode is disabled
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export function error_stripDebugPrefix(message) {
|
|
140
|
+
if (session.connection?.config?.debug) {
|
|
141
|
+
return message;
|
|
142
|
+
}
|
|
143
|
+
return message.replace(/^\[[^\]]+\]\s*\|\s*/, '');
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/builtins/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Result } from '@fnndsc/cumin';
|
|
2
|
+
/**
|
|
3
|
+
* Checks if a string contains wildcard characters.
|
|
4
|
+
*
|
|
5
|
+
* @param arg - The argument to check.
|
|
6
|
+
* @returns True if the argument contains wildcards.
|
|
7
|
+
*/
|
|
8
|
+
export declare function string_checkHasWildcard(arg: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Expands a wildcard pattern against the current directory.
|
|
11
|
+
*
|
|
12
|
+
* @param pattern - The glob pattern (e.g., "*.ts", "test*.json").
|
|
13
|
+
* @returns A Promise resolving to Result<string[]>.
|
|
14
|
+
* Ok([]) = no matches (not an error).
|
|
15
|
+
* Err(...) = couldn't expand (API failure, permission denied, etc.).
|
|
16
|
+
*/
|
|
17
|
+
export declare function wildcard_expand(pattern: string): Promise<Result<string[]>>;
|
|
18
|
+
/**
|
|
19
|
+
* Expands all wildcards in an argument list.
|
|
20
|
+
*
|
|
21
|
+
* @param args - The argument list potentially containing wildcards.
|
|
22
|
+
* @returns A Promise resolving to Result<string[]>.
|
|
23
|
+
* On error expanding any pattern, returns the error.
|
|
24
|
+
* Empty matches return the original pattern.
|
|
25
|
+
*/
|
|
26
|
+
export declare function wildcards_expandAll(args: string[]): Promise<Result<string[]>>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Wildcard expansion for shell commands.
|
|
3
|
+
*
|
|
4
|
+
* Provides glob pattern matching against the ChRIS filesystem.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { minimatch } from 'minimatch';
|
|
9
|
+
import { session } from '../session/index.js';
|
|
10
|
+
import { vfsDispatcher } from '@fnndsc/salsa';
|
|
11
|
+
import { listCache_get, Ok, Err, errorStack } from '@fnndsc/cumin';
|
|
12
|
+
/**
|
|
13
|
+
* Checks if a string contains wildcard characters.
|
|
14
|
+
*
|
|
15
|
+
* @param arg - The argument to check.
|
|
16
|
+
* @returns True if the argument contains wildcards.
|
|
17
|
+
*/
|
|
18
|
+
export function string_checkHasWildcard(arg) {
|
|
19
|
+
return /[*?[\]]/.test(arg);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Expands a wildcard pattern against the current directory.
|
|
23
|
+
*
|
|
24
|
+
* @param pattern - The glob pattern (e.g., "*.ts", "test*.json").
|
|
25
|
+
* @returns A Promise resolving to Result<string[]>.
|
|
26
|
+
* Ok([]) = no matches (not an error).
|
|
27
|
+
* Err(...) = couldn't expand (API failure, permission denied, etc.).
|
|
28
|
+
*/
|
|
29
|
+
export async function wildcard_expand(pattern) {
|
|
30
|
+
// If no wildcard, return as-is
|
|
31
|
+
if (!string_checkHasWildcard(pattern)) {
|
|
32
|
+
return Ok([pattern]);
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Get current directory
|
|
36
|
+
const cwd = await session.getCWD();
|
|
37
|
+
// Handle patterns with directory components (e.g., "data/*.txt")
|
|
38
|
+
let searchDir = cwd;
|
|
39
|
+
let matchPattern = pattern;
|
|
40
|
+
// Check if pattern has directory separator
|
|
41
|
+
if (pattern.includes('/')) {
|
|
42
|
+
const parts = pattern.split('/');
|
|
43
|
+
const lastPart = parts.pop() || '*';
|
|
44
|
+
const dirPart = parts.join('/');
|
|
45
|
+
// Resolve directory part (could be relative)
|
|
46
|
+
if (dirPart.startsWith('/')) {
|
|
47
|
+
searchDir = dirPart;
|
|
48
|
+
}
|
|
49
|
+
else if (dirPart === '.') {
|
|
50
|
+
searchDir = cwd;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Relative path - append to cwd
|
|
54
|
+
searchDir = `${cwd}/${dirPart}`.replace(/\/+/g, '/');
|
|
55
|
+
}
|
|
56
|
+
matchPattern = lastPart;
|
|
57
|
+
}
|
|
58
|
+
// List files in the directory (check cache first)
|
|
59
|
+
let items = [];
|
|
60
|
+
const listCache = listCache_get();
|
|
61
|
+
const cached = listCache.cache_get(searchDir);
|
|
62
|
+
if (cached) {
|
|
63
|
+
items = cached.data;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const vfsResult = await vfsDispatcher.list(searchDir);
|
|
67
|
+
if (vfsResult.ok) {
|
|
68
|
+
items = vfsResult.value;
|
|
69
|
+
listCache.cache_set(searchDir, items);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return Err();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Filter items by pattern
|
|
76
|
+
const matches = items
|
|
77
|
+
.filter((item) => minimatch(item.name, matchPattern))
|
|
78
|
+
.map((item) => {
|
|
79
|
+
// Return full path if we searched a different directory
|
|
80
|
+
if (searchDir !== cwd) {
|
|
81
|
+
return `${searchDir}/${item.name}`.replace(/\/+/g, '/');
|
|
82
|
+
}
|
|
83
|
+
return item.name;
|
|
84
|
+
});
|
|
85
|
+
// Ok([]) for no matches (not an error)
|
|
86
|
+
return Ok(matches);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
90
|
+
errorStack.stack_push("error", `Failed to expand wildcard '${pattern}': ${errorMsg}`);
|
|
91
|
+
return Err();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Expands all wildcards in an argument list.
|
|
96
|
+
*
|
|
97
|
+
* @param args - The argument list potentially containing wildcards.
|
|
98
|
+
* @returns A Promise resolving to Result<string[]>.
|
|
99
|
+
* On error expanding any pattern, returns the error.
|
|
100
|
+
* Empty matches return the original pattern.
|
|
101
|
+
*/
|
|
102
|
+
export async function wildcards_expandAll(args) {
|
|
103
|
+
const expanded = [];
|
|
104
|
+
for (const arg of args) {
|
|
105
|
+
const result = await wildcard_expand(arg);
|
|
106
|
+
if (!result.ok) {
|
|
107
|
+
// Propagate error up
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
// If no matches, use original pattern (let command handle "not found")
|
|
111
|
+
if (result.value.length === 0) {
|
|
112
|
+
expanded.push(arg);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
expanded.push(...result.value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return Ok(expanded);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=wildcard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wildcard.js","sourceRoot":"","sources":["../../src/builtins/wildcard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Canonical list of all registered command keys in COMMAND_HANDLERS.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from chell.ts so tests can verify wiring without importing
|
|
5
|
+
* the full application entry point and all its transitive dependencies.
|
|
6
|
+
* Must stay in sync with COMMAND_HANDLERS in chell.ts.
|
|
7
|
+
*/
|
|
8
|
+
export declare const COMMAND_HANDLERS_KEYS: string[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Canonical list of all registered command keys in COMMAND_HANDLERS.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from chell.ts so tests can verify wiring without importing
|
|
5
|
+
* the full application entry point and all its transitive dependencies.
|
|
6
|
+
* Must stay in sync with COMMAND_HANDLERS in chell.ts.
|
|
7
|
+
*/
|
|
8
|
+
export const COMMAND_HANDLERS_KEYS = [
|
|
9
|
+
// filesystem
|
|
10
|
+
'cd', 'pwd', 'ls', 'cat', 'cp', 'mv', 'rm', 'touch', 'mkdir', 'tree', 'du',
|
|
11
|
+
'upload', 'download', 'pull',
|
|
12
|
+
// net
|
|
13
|
+
'connect', 'logout', 'pacs', 'query', 'cubepath',
|
|
14
|
+
// sys
|
|
15
|
+
'context', 'physicalmode', 'prompt', 'timing', 'whoami', 'whereami', 'debug', 'help', 'proc',
|
|
16
|
+
// resources — canonical + aliases
|
|
17
|
+
'plugin', 'plugins',
|
|
18
|
+
'feed', 'feeds',
|
|
19
|
+
'pipeline', 'pipelines',
|
|
20
|
+
'compute', 'computes',
|
|
21
|
+
'files', 'links', 'dirs',
|
|
22
|
+
'store',
|
|
23
|
+
'tag', 'tags',
|
|
24
|
+
'group', 'groups',
|
|
25
|
+
'pluginmeta', 'pluginmetas', 'meta', 'metas',
|
|
26
|
+
'plugininstance', 'plugininstances', 'instance', 'instances', 'job', 'jobs',
|
|
27
|
+
'workflow', 'workflows',
|
|
28
|
+
'parametersofplugin',
|
|
29
|
+
// pacs delegation
|
|
30
|
+
'pacsservers', 'pacsqueries', 'pacsretrieve',
|
|
31
|
+
];
|
|
32
|
+
//# sourceMappingURL=command-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-keys.js","sourceRoot":"","sources":["../src/command-keys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,aAAa;IACb,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI;IAC1E,QAAQ,EAAE,UAAU,EAAE,MAAM;IAC5B,MAAM;IACN,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IAChD,MAAM;IACN,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAC5F,kCAAkC;IAClC,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,OAAO;IACf,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,UAAU;IACrB,OAAO,EAAE,OAAO,EAAE,MAAM;IACxB,OAAO;IACP,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,QAAQ;IACjB,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO;IAC5C,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM;IAC3E,UAAU,EAAE,WAAW;IACvB,oBAAoB;IACpB,kBAAkB;IAClB,aAAa,EAAE,aAAa,EAAE,cAAc;CAC7C,CAAC"}
|