@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.
Files changed (226) hide show
  1. package/dist/builtins/debug.d.ts +8 -0
  2. package/dist/builtins/debug.js +39 -0
  3. package/dist/builtins/debug.js.map +1 -0
  4. package/dist/builtins/executable.d.ts +22 -0
  5. package/dist/builtins/executable.js +115 -0
  6. package/dist/builtins/executable.js.map +1 -0
  7. package/dist/builtins/fs/cat.d.ts +16 -0
  8. package/dist/builtins/fs/cat.js +266 -0
  9. package/dist/builtins/fs/cat.js.map +1 -0
  10. package/dist/builtins/fs/cd.d.ts +42 -0
  11. package/dist/builtins/fs/cd.js +193 -0
  12. package/dist/builtins/fs/cd.js.map +1 -0
  13. package/dist/builtins/fs/cp.d.ts +10 -0
  14. package/dist/builtins/fs/cp.js +86 -0
  15. package/dist/builtins/fs/cp.js.map +1 -0
  16. package/dist/builtins/fs/download.d.ts +6 -0
  17. package/dist/builtins/fs/download.js +45 -0
  18. package/dist/builtins/fs/download.js.map +1 -0
  19. package/dist/builtins/fs/du.d.ts +58 -0
  20. package/dist/builtins/fs/du.js +210 -0
  21. package/dist/builtins/fs/du.js.map +1 -0
  22. package/dist/builtins/fs/edit.d.ts +7 -0
  23. package/dist/builtins/fs/edit.js +104 -0
  24. package/dist/builtins/fs/edit.js.map +1 -0
  25. package/dist/builtins/fs/ls.d.ts +8 -0
  26. package/dist/builtins/fs/ls.js +68 -0
  27. package/dist/builtins/fs/ls.js.map +1 -0
  28. package/dist/builtins/fs/mkdir.d.ts +9 -0
  29. package/dist/builtins/fs/mkdir.js +52 -0
  30. package/dist/builtins/fs/mkdir.js.map +1 -0
  31. package/dist/builtins/fs/mv.d.ts +10 -0
  32. package/dist/builtins/fs/mv.js +88 -0
  33. package/dist/builtins/fs/mv.js.map +1 -0
  34. package/dist/builtins/fs/pull.args.d.ts +22 -0
  35. package/dist/builtins/fs/pull.args.js +30 -0
  36. package/dist/builtins/fs/pull.args.js.map +1 -0
  37. package/dist/builtins/fs/pull.d.ts +26 -0
  38. package/dist/builtins/fs/pull.js +445 -0
  39. package/dist/builtins/fs/pull.js.map +1 -0
  40. package/dist/builtins/fs/pwd.d.ts +10 -0
  41. package/dist/builtins/fs/pwd.js +73 -0
  42. package/dist/builtins/fs/pwd.js.map +1 -0
  43. package/dist/builtins/fs/rm.d.ts +37 -0
  44. package/dist/builtins/fs/rm.js +197 -0
  45. package/dist/builtins/fs/rm.js.map +1 -0
  46. package/dist/builtins/fs/touch.d.ts +9 -0
  47. package/dist/builtins/fs/touch.js +76 -0
  48. package/dist/builtins/fs/touch.js.map +1 -0
  49. package/dist/builtins/fs/tree.d.ts +15 -0
  50. package/dist/builtins/fs/tree.js +84 -0
  51. package/dist/builtins/fs/tree.js.map +1 -0
  52. package/dist/builtins/fs/upload.d.ts +6 -0
  53. package/dist/builtins/fs/upload.js +48 -0
  54. package/dist/builtins/fs/upload.js.map +1 -0
  55. package/dist/builtins/help.d.ts +74 -0
  56. package/dist/builtins/help.js +1217 -0
  57. package/dist/builtins/help.js.map +1 -0
  58. package/dist/builtins/index.d.ts +45 -0
  59. package/dist/builtins/index.js +45 -0
  60. package/dist/builtins/index.js.map +1 -0
  61. package/dist/builtins/net/connect.d.ts +7 -0
  62. package/dist/builtins/net/connect.js +42 -0
  63. package/dist/builtins/net/connect.js.map +1 -0
  64. package/dist/builtins/net/cubepath.d.ts +18 -0
  65. package/dist/builtins/net/cubepath.js +102 -0
  66. package/dist/builtins/net/cubepath.js.map +1 -0
  67. package/dist/builtins/net/logout.d.ts +6 -0
  68. package/dist/builtins/net/logout.js +24 -0
  69. package/dist/builtins/net/logout.js.map +1 -0
  70. package/dist/builtins/net/pacs.d.ts +24 -0
  71. package/dist/builtins/net/pacs.js +121 -0
  72. package/dist/builtins/net/pacs.js.map +1 -0
  73. package/dist/builtins/net/pacsUtils.d.ts +85 -0
  74. package/dist/builtins/net/pacsUtils.js +184 -0
  75. package/dist/builtins/net/pacsUtils.js.map +1 -0
  76. package/dist/builtins/net/query.d.ts +60 -0
  77. package/dist/builtins/net/query.js +324 -0
  78. package/dist/builtins/net/query.js.map +1 -0
  79. package/dist/builtins/parametersofplugin.d.ts +13 -0
  80. package/dist/builtins/parametersofplugin.js +43 -0
  81. package/dist/builtins/parametersofplugin.js.map +1 -0
  82. package/dist/builtins/pluginExecute.d.ts +27 -0
  83. package/dist/builtins/pluginExecute.js +165 -0
  84. package/dist/builtins/pluginExecute.js.map +1 -0
  85. package/dist/builtins/proc.d.ts +6 -0
  86. package/dist/builtins/proc.helpers.d.ts +68 -0
  87. package/dist/builtins/proc.helpers.js +102 -0
  88. package/dist/builtins/proc.helpers.js.map +1 -0
  89. package/dist/builtins/proc.js +289 -0
  90. package/dist/builtins/proc.js.map +1 -0
  91. package/dist/builtins/res/compute.d.ts +6 -0
  92. package/dist/builtins/res/compute.js +55 -0
  93. package/dist/builtins/res/compute.js.map +1 -0
  94. package/dist/builtins/res/feed.d.ts +6 -0
  95. package/dist/builtins/res/feed.js +244 -0
  96. package/dist/builtins/res/feed.js.map +1 -0
  97. package/dist/builtins/res/feed.notes.d.ts +28 -0
  98. package/dist/builtins/res/feed.notes.js +24 -0
  99. package/dist/builtins/res/feed.notes.js.map +1 -0
  100. package/dist/builtins/res/files.d.ts +18 -0
  101. package/dist/builtins/res/files.js +85 -0
  102. package/dist/builtins/res/files.js.map +1 -0
  103. package/dist/builtins/res/group.d.ts +6 -0
  104. package/dist/builtins/res/group.js +54 -0
  105. package/dist/builtins/res/group.js.map +1 -0
  106. package/dist/builtins/res/pipeline.args.d.ts +22 -0
  107. package/dist/builtins/res/pipeline.args.js +28 -0
  108. package/dist/builtins/res/pipeline.args.js.map +1 -0
  109. package/dist/builtins/res/pipeline.d.ts +20 -0
  110. package/dist/builtins/res/pipeline.js +252 -0
  111. package/dist/builtins/res/pipeline.js.map +1 -0
  112. package/dist/builtins/res/plugin.d.ts +13 -0
  113. package/dist/builtins/res/plugin.js +140 -0
  114. package/dist/builtins/res/plugin.js.map +1 -0
  115. package/dist/builtins/res/plugininstance.d.ts +6 -0
  116. package/dist/builtins/res/plugininstance.js +53 -0
  117. package/dist/builtins/res/plugininstance.js.map +1 -0
  118. package/dist/builtins/res/pluginmeta.d.ts +6 -0
  119. package/dist/builtins/res/pluginmeta.js +53 -0
  120. package/dist/builtins/res/pluginmeta.js.map +1 -0
  121. package/dist/builtins/res/tag.d.ts +6 -0
  122. package/dist/builtins/res/tag.js +53 -0
  123. package/dist/builtins/res/tag.js.map +1 -0
  124. package/dist/builtins/res/workflow.d.ts +6 -0
  125. package/dist/builtins/res/workflow.js +53 -0
  126. package/dist/builtins/res/workflow.js.map +1 -0
  127. package/dist/builtins/store.d.ts +6 -0
  128. package/dist/builtins/store.js +107 -0
  129. package/dist/builtins/store.js.map +1 -0
  130. package/dist/builtins/sys/context.d.ts +6 -0
  131. package/dist/builtins/sys/context.js +50 -0
  132. package/dist/builtins/sys/context.js.map +1 -0
  133. package/dist/builtins/sys/physicalmode.d.ts +8 -0
  134. package/dist/builtins/sys/physicalmode.js +34 -0
  135. package/dist/builtins/sys/physicalmode.js.map +1 -0
  136. package/dist/builtins/sys/timing.d.ts +8 -0
  137. package/dist/builtins/sys/timing.js +34 -0
  138. package/dist/builtins/sys/timing.js.map +1 -0
  139. package/dist/builtins/sys/version.d.ts +15 -0
  140. package/dist/builtins/sys/version.js +23 -0
  141. package/dist/builtins/sys/version.js.map +1 -0
  142. package/dist/builtins/sys/whoami.d.ts +17 -0
  143. package/dist/builtins/sys/whoami.js +44 -0
  144. package/dist/builtins/sys/whoami.js.map +1 -0
  145. package/dist/builtins/utils.d.ts +55 -0
  146. package/dist/builtins/utils.js +145 -0
  147. package/dist/builtins/utils.js.map +1 -0
  148. package/dist/builtins/wildcard.d.ts +26 -0
  149. package/dist/builtins/wildcard.js +120 -0
  150. package/dist/builtins/wildcard.js.map +1 -0
  151. package/dist/command-keys.d.ts +8 -0
  152. package/dist/command-keys.js +32 -0
  153. package/dist/command-keys.js.map +1 -0
  154. package/dist/config/storeConfig.d.ts +57 -0
  155. package/dist/config/storeConfig.js +78 -0
  156. package/dist/config/storeConfig.js.map +1 -0
  157. package/dist/core/chiliDelegate.d.ts +21 -0
  158. package/dist/core/chiliDelegate.js +32 -0
  159. package/dist/core/chiliDelegate.js.map +1 -0
  160. package/dist/core/connect.d.ts +38 -0
  161. package/dist/core/connect.js +46 -0
  162. package/dist/core/connect.js.map +1 -0
  163. package/dist/core/dispatch.d.ts +95 -0
  164. package/dist/core/dispatch.js +618 -0
  165. package/dist/core/dispatch.js.map +1 -0
  166. package/dist/core/engine.d.ts +91 -0
  167. package/dist/core/engine.js +222 -0
  168. package/dist/core/engine.js.map +1 -0
  169. package/dist/core/preprocess.d.ts +46 -0
  170. package/dist/core/preprocess.js +146 -0
  171. package/dist/core/preprocess.js.map +1 -0
  172. package/dist/core/progress.d.ts +50 -0
  173. package/dist/core/progress.js +21 -0
  174. package/dist/core/progress.js.map +1 -0
  175. package/dist/core/promptContext.d.ts +49 -0
  176. package/dist/core/promptContext.js +39 -0
  177. package/dist/core/promptContext.js.map +1 -0
  178. package/dist/core/question.d.ts +27 -0
  179. package/dist/core/question.js +33 -0
  180. package/dist/core/question.js.map +1 -0
  181. package/dist/core/sink.d.ts +207 -0
  182. package/dist/core/sink.js +329 -0
  183. package/dist/core/sink.js.map +1 -0
  184. package/dist/core/surface.d.ts +172 -0
  185. package/dist/core/surface.js +105 -0
  186. package/dist/core/surface.js.map +1 -0
  187. package/dist/core/version.d.ts +20 -0
  188. package/dist/core/version.js +82 -0
  189. package/dist/core/version.js.map +1 -0
  190. package/dist/index.d.ts +31 -0
  191. package/dist/index.js +32 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/lib/completer/index.d.ts +15 -0
  194. package/dist/lib/completer/index.js +212 -0
  195. package/dist/lib/completer/index.js.map +1 -0
  196. package/dist/lib/completer/pathComplete.helpers.d.ts +22 -0
  197. package/dist/lib/completer/pathComplete.helpers.js +49 -0
  198. package/dist/lib/completer/pathComplete.helpers.js.map +1 -0
  199. package/dist/lib/parser.d.ts +13 -0
  200. package/dist/lib/parser.js +52 -0
  201. package/dist/lib/parser.js.map +1 -0
  202. package/dist/lib/pipe.d.ts +11 -0
  203. package/dist/lib/pipe.js +90 -0
  204. package/dist/lib/pipe.js.map +1 -0
  205. package/dist/lib/prefetch.d.ts +25 -0
  206. package/dist/lib/prefetch.js +64 -0
  207. package/dist/lib/prefetch.js.map +1 -0
  208. package/dist/lib/semicolonParser.d.ts +22 -0
  209. package/dist/lib/semicolonParser.js +53 -0
  210. package/dist/lib/semicolonParser.js.map +1 -0
  211. package/dist/lib/spinner.d.ts +23 -0
  212. package/dist/lib/spinner.js +71 -0
  213. package/dist/lib/spinner.js.map +1 -0
  214. package/dist/lib/vfs/providers/static.d.ts +65 -0
  215. package/dist/lib/vfs/providers/static.js +164 -0
  216. package/dist/lib/vfs/providers/static.js.map +1 -0
  217. package/dist/lib/vfs/providers/static_content.d.ts +27 -0
  218. package/dist/lib/vfs/providers/static_content.js +180 -0
  219. package/dist/lib/vfs/providers/static_content.js.map +1 -0
  220. package/dist/lib/vfs/vfs.d.ts +59 -0
  221. package/dist/lib/vfs/vfs.js +202 -0
  222. package/dist/lib/vfs/vfs.js.map +1 -0
  223. package/dist/session/index.d.ts +76 -0
  224. package/dist/session/index.js +120 -0
  225. package/dist/session/index.js.map +1 -0
  226. package/package.json +58 -0
@@ -0,0 +1,8 @@
1
+ import { CommandEnvelope } from '@fnndsc/cumin';
2
+ /**
3
+ * Toggles or displays debug mode status.
4
+ *
5
+ * @param args - Command line arguments: 'on', 'off', or empty to display status.
6
+ * @returns An envelope describing the (possibly updated) debug state.
7
+ */
8
+ export declare function builtin_debug(args: string[]): Promise<CommandEnvelope>;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @file Debug Command
3
+ *
4
+ * Toggles debug mode for the application, reported as a command envelope.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { envelope_ok, envelope_error } from '@fnndsc/cumin';
8
+ import { session } from '../session/index.js';
9
+ /**
10
+ * Toggles or displays debug mode status.
11
+ *
12
+ * @param args - Command line arguments: 'on', 'off', or empty to display status.
13
+ * @returns An envelope describing the (possibly updated) debug state.
14
+ */
15
+ export async function builtin_debug(args) {
16
+ const subcommand = args[0];
17
+ const config = session.connection.config;
18
+ if (!config) {
19
+ return envelope_error('', [{ type: 'error', message: 'Error: Connection configuration not initialized.' }], `${chalk.red('Error: Connection configuration not initialized.')}\n`);
20
+ }
21
+ if (!subcommand) {
22
+ const enabled = config.debug;
23
+ const status = enabled ? 'enabled' : 'disabled';
24
+ const detail = enabled
25
+ ? chalk.gray(' Verbose error logging is enabled.')
26
+ : chalk.gray(' Verbose error logging is disabled.');
27
+ return envelope_ok(`Debug mode: ${chalk.yellow(status)}\n${detail}\n${chalk.gray('\nUsage: debug [on|off]')}\n`, { kind: 'sys.debug', data: { enabled } });
28
+ }
29
+ if (subcommand === 'on') {
30
+ config.debug = true;
31
+ return envelope_ok(`${chalk.yellow('[!] Debug mode enabled')}\n${chalk.gray(' Verbose error logging activated.')}\n`, { kind: 'sys.debug', data: { enabled: true } });
32
+ }
33
+ if (subcommand === 'off') {
34
+ config.debug = false;
35
+ return envelope_ok(`${chalk.green('[+] Debug mode disabled')}\n${chalk.gray(' Verbose error logging deactivated.')}\n`, { kind: 'sys.debug', data: { enabled: false } });
36
+ }
37
+ return envelope_error(`${chalk.red(`Unknown argument: ${subcommand}`)}\n${chalk.gray('Usage: debug [on|off]')}\n`);
38
+ }
39
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/builtins/debug.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,UAAU,GAAuB,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAiC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;IAEvE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,cAAc,CACnB,EAAE,EACF,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC,EAChF,GAAG,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,IAAI,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAY,MAAM,CAAC,KAAK,CAAC;QACtC,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,qCAAqC,CAAC;YACnD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvD,OAAO,WAAW,CAChB,eAAe,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAC5F,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CACzC,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,IAAI,EACpG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAC/C,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,OAAO,WAAW,CAChB,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,IAAI,EACtG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAChD,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAC5F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @file Builtin handler for executing a plugin as a shell command.
3
+ *
4
+ * @module
5
+ */
6
+ type PluginExecutableOptions = {
7
+ piped?: boolean;
8
+ };
9
+ /**
10
+ * Handles simulated execution of plugins (e.g., "pl-simpledsapp-v1.2.3 --parameters").
11
+ *
12
+ * This acts as an interceptor for the main shell loop. If the user input matches a
13
+ * known plugin name format, it routes the request to the appropriate ChRIS/ChILI logic,
14
+ * simulating a native executable experience.
15
+ *
16
+ * @param command - The command string (potentially a plugin name).
17
+ * @param args - The arguments passed to the command.
18
+ * @param options - Optional flags for piped/non-interactive handling.
19
+ * @returns A Promise resolving to true if the command was handled as a plugin execution, false otherwise.
20
+ */
21
+ export declare function pluginExecutable_handle(command: string, args: string[], options?: PluginExecutableOptions): Promise<boolean>;
22
+ export {};
@@ -0,0 +1,115 @@
1
+ /**
2
+ * @file Builtin handler for executing a plugin as a shell command.
3
+ *
4
+ * @module
5
+ */
6
+ import chalk from 'chalk';
7
+ import { spinner } from '../lib/spinner.js';
8
+ import { builtin_parametersofplugin } from './parametersofplugin.js';
9
+ import { plugins_list, plugins_listAll } from '@fnndsc/salsa';
10
+ import { pluginReadme_fetch, pluginReadme_render } from '@fnndsc/chili/commands/plugin/readme.js';
11
+ /**
12
+ * Handles simulated execution of plugins (e.g., "pl-simpledsapp-v1.2.3 --parameters").
13
+ *
14
+ * This acts as an interceptor for the main shell loop. If the user input matches a
15
+ * known plugin name format, it routes the request to the appropriate ChRIS/ChILI logic,
16
+ * simulating a native executable experience.
17
+ *
18
+ * @param command - The command string (potentially a plugin name).
19
+ * @param args - The arguments passed to the command.
20
+ * @param options - Optional flags for piped/non-interactive handling.
21
+ * @returns A Promise resolving to true if the command was handled as a plugin execution, false otherwise.
22
+ */
23
+ export async function pluginExecutable_handle(command, args, options) {
24
+ // Expected format: name-vVersion (e.g., "pl-simpledsapp-v2.1.3")
25
+ const versionSeparatorIndex = command.lastIndexOf('-v');
26
+ if (versionSeparatorIndex === -1) {
27
+ return false;
28
+ }
29
+ const name = command.substring(0, versionSeparatorIndex);
30
+ const version = command.substring(versionSeparatorIndex + 2);
31
+ if (!name || !version) {
32
+ return false;
33
+ }
34
+ const showHelp = args.includes('--help') || args.includes('-h');
35
+ const isPipedOutput = !!options?.piped || !process.stdout.isTTY;
36
+ if (showHelp) {
37
+ console.log(chalk.cyan(`Plugin executable flags for ${name}-v${version}:`));
38
+ console.log(' --parameters Show parameter definitions for this plugin version');
39
+ console.log(' --readme Show README (rendered) from plugin metadata repository URL');
40
+ console.log(' --readme --raw Output raw markdown, suitable for piping to glow or bat');
41
+ return true;
42
+ }
43
+ const plugin_resolveExact = async () => {
44
+ try {
45
+ const resultsExactUnknown = await plugins_list({
46
+ search: {
47
+ name_exact: name,
48
+ version: version
49
+ }
50
+ });
51
+ const resultsExact = resultsExactUnknown;
52
+ let candidate = resultsExact?.tableData?.[0];
53
+ if (!candidate || candidate.name !== name || candidate.version !== version) {
54
+ const allVersionsUnknown = await plugins_listAll({
55
+ search: { name: name }
56
+ });
57
+ const allVersions = allVersionsUnknown;
58
+ candidate = allVersions?.tableData?.find((p) => p.name === name && p.version === version);
59
+ }
60
+ if (!candidate ||
61
+ typeof candidate.id !== 'number' ||
62
+ typeof candidate.name !== 'string' ||
63
+ typeof candidate.version !== 'string') {
64
+ return null;
65
+ }
66
+ return { id: candidate.id, name: candidate.name, version: candidate.version };
67
+ }
68
+ catch (error) {
69
+ console.error(chalk.red(`Error resolving plugin: ${error instanceof Error ? error.message : String(error)}`));
70
+ return null;
71
+ }
72
+ };
73
+ if (args.includes('--readme')) {
74
+ const rawMode = args.includes('--raw');
75
+ console.log(chalk.cyan(`Resolving plugin ${name} v${version} for README...`));
76
+ const resolved = await plugin_resolveExact();
77
+ if (!resolved) {
78
+ console.log(chalk.red(`Plugin ${name} v${version} not found.`));
79
+ return true;
80
+ }
81
+ spinner.start(`Fetching README for ${resolved.name} v${resolved.version}...`);
82
+ try {
83
+ const content = await pluginReadme_fetch(String(resolved.id));
84
+ spinner.stop();
85
+ if (content) {
86
+ console.log(rawMode ? content : pluginReadme_render(content));
87
+ }
88
+ else {
89
+ console.log(chalk.yellow(`No README found for ${resolved.name} v${resolved.version}.`));
90
+ }
91
+ }
92
+ catch (error) {
93
+ spinner.stop();
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ console.log(chalk.red(`Failed to fetch README: ${message}`));
96
+ }
97
+ return true;
98
+ }
99
+ if (args.includes('--parameters')) {
100
+ console.log(chalk.cyan(`Fetching parameters for plugin ${name} v${version}...`));
101
+ const resolved = await plugin_resolveExact();
102
+ if (!resolved) {
103
+ console.log(chalk.red(`Plugin ${name} v${version} not found.`));
104
+ return true; // Handled (attempted), but failed
105
+ }
106
+ console.log(chalk.cyan(`Resolved Plugin: ${resolved.name} v${resolved.version} (ID: ${resolved.id})`));
107
+ // Delegate to parametersofplugin builtin with the resolved context
108
+ await builtin_parametersofplugin(['list', '--plugin-id', String(resolved.id)]);
109
+ return true;
110
+ }
111
+ // If command matches plugin format but no handled flags are present,
112
+ // return false to let the main loop handle it (or show unknown command).
113
+ return false;
114
+ }
115
+ //# sourceMappingURL=executable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executable.js","sourceRoot":"","sources":["../../src/builtins/executable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CommandEnvelope } from '@fnndsc/cumin';
2
+ /**
3
+ * Displays the content of one or more files.
4
+ *
5
+ * Supports multiple files and concatenates their output. Binary mode is applied
6
+ * consistently to all files if any file is detected as binary or --binary is specified.
7
+ * Text content and errors are buffered into the envelope; binary content streams
8
+ * to the terminal directly with backpressure (raw bytes are not envelope text),
9
+ * and the binary auto-detection notice is emitted live on the err channel so it
10
+ * precedes the bytes it describes.
11
+ *
12
+ * @param args - Command line arguments (file paths and optional --binary flag).
13
+ * @returns An envelope whose rendered text carries the (highlighted) file
14
+ * contents and whose model lists per-file outcomes.
15
+ */
16
+ export declare function builtin_cat(args: string[]): Promise<CommandEnvelope>;
@@ -0,0 +1,266 @@
1
+ /**
2
+ * @file Builtin cat command.
3
+ * Displays file contents, reported as a command envelope.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { path_resolve, error_stripDebugPrefix } from '../utils.js';
7
+ import { files_cat as chefs_cat_cmd, files_catBinary as chefs_catBinary_cmd } from '@fnndsc/chili/commands/fs/cat.js';
8
+ import { cat_render } from '@fnndsc/chili/views/fs.js';
9
+ import { errorStack, envelope_ok, envelope_error } from '@fnndsc/cumin';
10
+ import { sink_get } from '../../core/sink.js';
11
+ import * as path from 'path';
12
+ /** File extensions that receive syntax highlighting. */
13
+ const HIGHLIGHT_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);
14
+ /**
15
+ * Applies chalk-based syntax highlighting to JSON content.
16
+ * Returns the original string if the content is not valid JSON.
17
+ *
18
+ * @param content - Raw JSON string.
19
+ * @returns Highlighted string, or original on parse failure.
20
+ */
21
+ function json_highlight(content) {
22
+ try {
23
+ JSON.parse(content);
24
+ }
25
+ catch {
26
+ return content;
27
+ }
28
+ return content.replace(/("(?:\\u[0-9a-fA-F]{4}|\\[^u]|[^\\"])*"(\s*:)?|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)/g, (match) => {
29
+ if (match.endsWith(':'))
30
+ return chalk.cyan(match); // key
31
+ if (match.startsWith('"'))
32
+ return chalk.green(match); // string value
33
+ if (match === 'true' || match === 'false')
34
+ return chalk.yellow(match);
35
+ if (match === 'null')
36
+ return chalk.gray(match);
37
+ return chalk.magenta(match); // number
38
+ });
39
+ }
40
+ /**
41
+ * Applies chalk-based syntax highlighting to YAML content line by line.
42
+ *
43
+ * @param content - Raw YAML string.
44
+ * @returns Highlighted string.
45
+ */
46
+ function yaml_highlight(content) {
47
+ return content.split('\n').map((line) => {
48
+ if (/^\s*#/.test(line))
49
+ return chalk.gray(line);
50
+ const kv = line.match(/^(\s*)([\w./-]+)(\s*:\s*)(.*)/);
51
+ if (kv) {
52
+ const [, indent, key, sep, value] = kv;
53
+ const coloredValue = value_yamlColor(value);
54
+ return `${indent}${chalk.cyan(key)}${chalk.gray(sep)}${coloredValue}`;
55
+ }
56
+ const listItem = line.match(/^(\s*-\s+)(.*)/);
57
+ if (listItem) {
58
+ return `${chalk.gray(listItem[1])}${chalk.green(listItem[2])}`;
59
+ }
60
+ return line;
61
+ }).join('\n');
62
+ }
63
+ /**
64
+ * Colors a scalar YAML value based on its type.
65
+ *
66
+ * @param value - The raw value string from a YAML key: value line.
67
+ * @returns Chalk-colored value string.
68
+ */
69
+ function value_yamlColor(value) {
70
+ if (!value)
71
+ return value;
72
+ if (value === 'true' || value === 'false')
73
+ return chalk.yellow(value);
74
+ if (value === 'null' || value === '~')
75
+ return chalk.gray(value);
76
+ if (/^-?\d+(\.\d+)?$/.test(value))
77
+ return chalk.magenta(value);
78
+ if (/^["']/.test(value))
79
+ return chalk.green(value);
80
+ return chalk.white(value);
81
+ }
82
+ /**
83
+ * Applies syntax highlighting to text content based on file extension.
84
+ * Returns the original string unchanged when stdout is not a TTY (piping).
85
+ *
86
+ * @param content - File content string.
87
+ * @param filePath - Full path used to determine the file type.
88
+ * @returns Highlighted or original content.
89
+ */
90
+ function content_highlight(content, filePath) {
91
+ if (!process.stdout.isTTY)
92
+ return content;
93
+ const ext = path.extname(filePath).toLowerCase();
94
+ if (ext === '.json')
95
+ return json_highlight(content);
96
+ if (ext === '.yaml' || ext === '.yml')
97
+ return yaml_highlight(content);
98
+ return content;
99
+ }
100
+ /**
101
+ * List of file extensions that are considered binary.
102
+ */
103
+ const BINARY_EXTENSIONS = new Set([
104
+ '.dcm', // DICOM medical images
105
+ '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.webp', // Images
106
+ '.pdf', // Documents
107
+ '.zip', '.tar', '.gz', '.bz2', '.xz', '.7z', '.rar', // Archives
108
+ '.exe', '.dll', '.so', '.dylib', '.bin', // Executables/Libraries
109
+ '.mp3', '.mp4', '.avi', '.mov', '.wav', '.flac', // Media
110
+ ]);
111
+ /**
112
+ * Checks if a file path has a binary extension.
113
+ *
114
+ * @param filePath - The file path to check.
115
+ * @returns True if the file has a binary extension.
116
+ */
117
+ function extension_isBinary(filePath) {
118
+ const ext = path.extname(filePath).toLowerCase();
119
+ return BINARY_EXTENSIONS.has(ext);
120
+ }
121
+ /**
122
+ * Writes a buffer to stdout with proper backpressure handling.
123
+ *
124
+ * Splits large buffers into 64KB chunks and waits for drain events when the
125
+ * output buffer is full. This prevents data loss when piping large binary files
126
+ * to external commands. Waits for all data to be flushed before resolving.
127
+ *
128
+ * @param buffer - The buffer to write to stdout.
129
+ * @returns A Promise that resolves when all data has been written and flushed.
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const dicomData: Buffer = await fetchDicomFile();
134
+ * await buffer_writeToStdout(dicomData);
135
+ * ```
136
+ */
137
+ async function buffer_writeToStdout(buffer) {
138
+ return new Promise((resolve, reject) => {
139
+ if (buffer.length === 0) {
140
+ resolve();
141
+ return;
142
+ }
143
+ let offset = 0;
144
+ const chunkSize = 64 * 1024; // 64KB chunks
145
+ /**
146
+ * Recursively writes the next chunk of data to stdout.
147
+ * Handles backpressure by waiting for drain events when buffer is full.
148
+ */
149
+ const chunk_writeNext = () => {
150
+ try {
151
+ while (offset < buffer.length) {
152
+ const end = Math.min(offset + chunkSize, buffer.length);
153
+ const chunk = buffer.subarray(offset, end);
154
+ offset = end;
155
+ const canContinue = process.stdout.write(chunk);
156
+ if (!canContinue) {
157
+ // Buffer is full, wait for drain event
158
+ process.stdout.once('drain', chunk_writeNext);
159
+ return;
160
+ }
161
+ }
162
+ // All chunks written - ensure stdout is flushed before resolving
163
+ // Writing an empty string forces a flush check. If write() returns false,
164
+ // the buffer is full and we must wait for drain. This prevents truncation
165
+ // when piping to external processes, as Node.js won't exit until we resolve.
166
+ if (process.stdout.write('')) {
167
+ // Buffer has space, all data is flushed
168
+ resolve();
169
+ }
170
+ else {
171
+ // Buffer is full, wait for final drain before resolving
172
+ process.stdout.once('drain', () => resolve());
173
+ }
174
+ }
175
+ catch (err) {
176
+ reject(err);
177
+ }
178
+ };
179
+ chunk_writeNext();
180
+ });
181
+ }
182
+ /**
183
+ * Displays the content of one or more files.
184
+ *
185
+ * Supports multiple files and concatenates their output. Binary mode is applied
186
+ * consistently to all files if any file is detected as binary or --binary is specified.
187
+ * Text content and errors are buffered into the envelope; binary content streams
188
+ * to the terminal directly with backpressure (raw bytes are not envelope text),
189
+ * and the binary auto-detection notice is emitted live on the err channel so it
190
+ * precedes the bytes it describes.
191
+ *
192
+ * @param args - Command line arguments (file paths and optional --binary flag).
193
+ * @returns An envelope whose rendered text carries the (highlighted) file
194
+ * contents and whose model lists per-file outcomes.
195
+ */
196
+ export async function builtin_cat(args) {
197
+ let binaryMode = false;
198
+ const filePaths = [];
199
+ for (const arg of args) {
200
+ if (arg === '--binary') {
201
+ binaryMode = true;
202
+ }
203
+ else {
204
+ filePaths.push(arg);
205
+ }
206
+ }
207
+ if (filePaths.length === 0) {
208
+ return envelope_error('', undefined, `${chalk.red('Usage: cat [--binary] <file> [file...]')}\n`);
209
+ }
210
+ let rendered = '';
211
+ let renderedErr = '';
212
+ const outcomes = [];
213
+ let anyFailed = false;
214
+ for (let i = 0; i < filePaths.length; i++) {
215
+ const pathArg = filePaths[i];
216
+ const target = await path_resolve(pathArg);
217
+ // Auto-detect binary files
218
+ const isBinaryFile = extension_isBinary(target);
219
+ // Inform user about auto-detection only if in interactive mode (stdout is TTY).
220
+ // Emitted live (not buffered) so the notice precedes the raw bytes it announces.
221
+ // Only show on first file to avoid spam.
222
+ if (i === 0 && isBinaryFile && !binaryMode && process.stdout.isTTY) {
223
+ sink_get().err_write(`${chalk.cyan(`Info: ${pathArg} detected as binary file (${path.extname(target)}), using binary mode.`)}\n`);
224
+ sink_get().err_write(`${chalk.cyan('Tip: Use "cat --binary <file>" to explicitly request binary mode.')}\n`);
225
+ sink_get().err_write('\n');
226
+ }
227
+ // Use binary mode if requested OR if file is detected as binary
228
+ if (binaryMode || isBinaryFile) {
229
+ const result = await chefs_catBinary_cmd(target);
230
+ if (!result.ok) {
231
+ const error = errorStack.stack_pop();
232
+ renderedErr += `${chalk.red(`cat: ${pathArg}: ${error ? error_stripDebugPrefix(error.message) : 'Unknown error'}`)}\n`;
233
+ outcomes.push({ path: pathArg, ok: false, binary: true });
234
+ anyFailed = true;
235
+ process.exitCode = 1;
236
+ continue;
237
+ }
238
+ // Output raw buffer to stdout with backpressure handling
239
+ await buffer_writeToStdout(result.value);
240
+ outcomes.push({ path: pathArg, ok: true, binary: true, bytes: result.value.length });
241
+ }
242
+ else {
243
+ const result = await chefs_cat_cmd(target);
244
+ if (!result.ok) {
245
+ const error = errorStack.stack_pop();
246
+ renderedErr += `${chalk.red(`cat: ${pathArg}: ${error ? error_stripDebugPrefix(error.message) : 'Unknown error'}`)}\n`;
247
+ outcomes.push({ path: pathArg, ok: false, binary: false });
248
+ anyFailed = true;
249
+ process.exitCode = 1;
250
+ continue;
251
+ }
252
+ const highlighted = content_highlight(result.value, target);
253
+ rendered += `${cat_render(highlighted, pathArg)}\n`;
254
+ outcomes.push({ path: pathArg, ok: true, binary: false });
255
+ }
256
+ }
257
+ const model = { kind: 'fs.cat', data: outcomes };
258
+ if (anyFailed) {
259
+ const envelope = envelope_error(rendered, undefined, renderedErr || undefined);
260
+ envelope.model = model;
261
+ return envelope;
262
+ }
263
+ const envelope = envelope_ok(rendered, model);
264
+ return envelope;
265
+ }
266
+ //# sourceMappingURL=cat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/builtins/fs/cat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { CommandEnvelope } from '@fnndsc/cumin';
2
+ /**
3
+ * Interface representing a FileBrowserFolder from ChRIS API.
4
+ */
5
+ interface FileBrowserFolder {
6
+ path?: string;
7
+ data?: {
8
+ path?: string;
9
+ };
10
+ }
11
+ /**
12
+ * Normalizes a logical path for VFS comparison by stripping a single trailing
13
+ * slash (except for the root path).
14
+ *
15
+ * @param logicalPath - The resolved logical path.
16
+ * @returns The normalized path.
17
+ */
18
+ export declare function vfsPath_normalize(logicalPath: string): string;
19
+ /**
20
+ * Reports whether a path is a structural VFS container (always valid).
21
+ *
22
+ * @param cleanPath - The normalized path.
23
+ * @returns True if the path is a known structural VFS container.
24
+ */
25
+ export declare function vfsPath_isStructural(cleanPath: string): boolean;
26
+ /**
27
+ * Verifies if a given FileBrowserFolder object exactly matches the validation path.
28
+ *
29
+ * @param folder - The FileBrowserFolder object to verify.
30
+ * @param validationPath - The path to match against.
31
+ * @returns True if the folder path exactly matches validationPath, false otherwise.
32
+ */
33
+ export declare function folder_verifyPathMatch(folder: FileBrowserFolder | null | undefined, validationPath: string): boolean;
34
+ /**
35
+ * Changes the current working directory in the ChRIS filesystem context.
36
+ * Validates the existence of the target path before setting it.
37
+ *
38
+ * @param args - An array containing the target path as the first element.
39
+ * @returns An envelope carrying the new working directory on success.
40
+ */
41
+ export declare function builtin_cd(args: string[]): Promise<CommandEnvelope>;
42
+ export {};