@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 @@
1
+ {"version":3,"file":"parametersofplugin.js","sourceRoot":"","sources":["../../src/builtins/parametersofplugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAc;IAC3D,MAAM,UAAU,GAAe,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,UAAU,GAAY,UAAU,CAAC,CAAc,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B;IACvF,MAAM,gBAAgB,GAAuB,UAAU,CAAC,WAAW,CAAW,CAAC;IAE/E,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;QAC7F,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,sCAAsC;QACtC,MAAM,OAAO,GAA8B,MAAM,yBAAyB,CAAC,cAAc,CACrF,oBAAoB,EACpB,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAC1D,CAAC;QAEF,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACxB,4DAA4D;YAC5D,MAAM,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;IAEL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,MAAM,GAAG,GAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;AACL,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @file Plugin Execute Builtin
3
+ *
4
+ * This module implements the builtin for executing plugins "in place"
5
+ * based on current directory context.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Executes a plugin in the current directory context.
11
+ *
12
+ * This function is called when the user types a plugin name that exists in /bin.
13
+ * It handles parameter parsing, interactive prompts, and delegates execution to salsa.
14
+ *
15
+ * @param pluginName - Full plugin name with version (e.g., pl-dcm2niix-v2.1.1).
16
+ * @param args - Array of command line arguments.
17
+ * @returns Promise that resolves when execution completes.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // User types: pl-dcm2niix-v2.1.1 --outputdir results -- feed_title="Brain MRI"
22
+ * await builtin_executePlugin('pl-dcm2niix-v2.1.1', [
23
+ * '--outputdir', 'results', '--', 'feed_title=Brain MRI'
24
+ * ]);
25
+ * ```
26
+ */
27
+ export declare function builtin_executePlugin(pluginName: string, args: string[]): Promise<void>;
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @file Plugin Execute Builtin
3
+ *
4
+ * This module implements the builtin for executing plugins "in place"
5
+ * based on current directory context.
6
+ *
7
+ * @module
8
+ */
9
+ import { plugin_executeInPlace } from '@fnndsc/salsa';
10
+ import { dictionary_fromCLI, errorStack, procCache_get } from '@fnndsc/cumin';
11
+ import chalk from 'chalk';
12
+ import { session } from '../session/index.js';
13
+ import { vfs } from '../lib/vfs/vfs.js';
14
+ /**
15
+ * Parses a plugin name from /bin format (name-vVersion) into ChRIS search format.
16
+ *
17
+ * @param pluginName - Plugin name in format: pl-name-vX.Y.Z
18
+ * @returns Search string in format: name_exact:pl-name,version:X.Y.Z
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * pluginName_toSearchString('pl-dcm2niix-v1.0.2')
23
+ * // Returns: 'name_exact:pl-dcm2niix,version:1.0.2'
24
+ * ```
25
+ */
26
+ function pluginName_toSearchString(pluginName) {
27
+ // Pattern: (name)-v(version)
28
+ const match = pluginName.match(/^(.+)-v(.+)$/);
29
+ if (match) {
30
+ const name = match[1];
31
+ const version = match[2];
32
+ return `name_exact:${name},version:${version}`;
33
+ }
34
+ // Fallback: if no version suffix, search by name only
35
+ return `name_exact:${pluginName}`;
36
+ }
37
+ /**
38
+ * Executes a plugin in the current directory context.
39
+ *
40
+ * This function is called when the user types a plugin name that exists in /bin.
41
+ * It handles parameter parsing, interactive prompts, and delegates execution to salsa.
42
+ *
43
+ * @param pluginName - Full plugin name with version (e.g., pl-dcm2niix-v2.1.1).
44
+ * @param args - Array of command line arguments.
45
+ * @returns Promise that resolves when execution completes.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * // User types: pl-dcm2niix-v2.1.1 --outputdir results -- feed_title="Brain MRI"
50
+ * await builtin_executePlugin('pl-dcm2niix-v2.1.1', [
51
+ * '--outputdir', 'results', '--', 'feed_title=Brain MRI'
52
+ * ]);
53
+ * ```
54
+ */
55
+ export async function builtin_executePlugin(pluginName, args) {
56
+ try {
57
+ // 1. Parse arguments - split on '--' delimiter
58
+ const argsString = args.join(' ');
59
+ let pluginArgsStr = argsString;
60
+ let contextArgsStr = '';
61
+ // Check for ' -- ' delimiter (space-dash-dash-space)
62
+ const delimiterIndex = argsString.indexOf(' -- ');
63
+ if (delimiterIndex !== -1) {
64
+ pluginArgsStr = argsString.substring(0, delimiterIndex);
65
+ contextArgsStr = argsString.substring(delimiterIndex + 4); // +4 to skip ' -- '
66
+ }
67
+ // 2. Parse both sets of parameters
68
+ let pluginParams = {};
69
+ let contextParams = {};
70
+ if (pluginArgsStr.trim()) {
71
+ try {
72
+ pluginParams = dictionary_fromCLI(pluginArgsStr);
73
+ }
74
+ catch (e) {
75
+ const msg = e instanceof Error ? e.message : String(e);
76
+ console.error(chalk.red(`Error parsing plugin parameters: ${msg}`));
77
+ return;
78
+ }
79
+ }
80
+ if (contextArgsStr.trim()) {
81
+ try {
82
+ contextParams = dictionary_fromCLI(contextArgsStr);
83
+ }
84
+ catch (e) {
85
+ const msg = e instanceof Error ? e.message : String(e);
86
+ console.error(chalk.red(`Error parsing context parameters: ${msg}`));
87
+ return;
88
+ }
89
+ }
90
+ // 3. Set default context params if not provided
91
+ const cwd = await session.getCWD();
92
+ const isInFeed = cwd.includes('/feeds/feed_');
93
+ // If no context params provided and not in a feed, use directory name as feed title
94
+ if (!contextArgsStr && !isInFeed) {
95
+ const defaultTitle = cwd.split('/').pop() || 'Untitled';
96
+ contextParams.feed_title = defaultTitle;
97
+ console.log(chalk.cyan(`Using feed title: "${defaultTitle}" (customize with -- feed_title="Custom Title")`));
98
+ }
99
+ // 4. Get /bin listing for finding pl-dircopy
100
+ const binResult = await vfs.data_get('/bin');
101
+ if (!binResult.ok) {
102
+ console.error(chalk.red('Failed to access /bin directory'));
103
+ return;
104
+ }
105
+ const binListing = binResult.value.map((item) => item.name);
106
+ // 5. Convert plugin name from /bin format to ChRIS search format
107
+ // Example: pl-dcm2niix-v1.0.2 → name_exact:pl-dcm2niix,version:1.0.2
108
+ const pluginSearchString = pluginName_toSearchString(pluginName);
109
+ // 6. Execute via salsa
110
+ const result = await plugin_executeInPlace(pluginSearchString, pluginParams, contextParams, cwd, binListing);
111
+ if (!result) {
112
+ // Display all errors from the stack for better debugging
113
+ console.error(chalk.red('Plugin execution failed:'));
114
+ let error = errorStack.stack_pop();
115
+ while (error) {
116
+ console.error(chalk.red(` - ${error.message}`));
117
+ error = errorStack.stack_pop();
118
+ }
119
+ return;
120
+ }
121
+ // 7. Push to procCache so /proc reflects new jobs immediately
122
+ if (result.feedID !== undefined && result.dircopyInstanceID !== undefined) {
123
+ // New feed: push dircopy root node + plugin node
124
+ const feedTitle = cwd.split('/').pop() || `feed_${result.feedID}`;
125
+ procCache_get().feed_add({
126
+ id: result.feedID, title: feedTitle,
127
+ creationDate: new Date().toISOString(),
128
+ finishedJobs: 0, erroredJobs: 0, startedJobs: 0,
129
+ scheduledJobs: 2, cancelledJobs: 0, createdJobs: 0,
130
+ });
131
+ procCache_get().instance_add({
132
+ id: result.dircopyInstanceID, feedID: result.feedID,
133
+ parentID: null, pluginName: 'pl-dircopy', params: null,
134
+ });
135
+ procCache_get().instance_add({
136
+ id: result.pluginInstanceID, feedID: result.feedID,
137
+ parentID: result.dircopyInstanceID, pluginName: result.pluginName, params: null,
138
+ });
139
+ }
140
+ else if (result.parentID !== null) {
141
+ // Continue feed: push just the new instance
142
+ const feedID = (() => {
143
+ const inst = procCache_get().instance_get(result.parentID);
144
+ return inst ? inst.feedID : null;
145
+ })();
146
+ if (feedID !== null) {
147
+ procCache_get().instance_add({
148
+ id: result.pluginInstanceID, feedID,
149
+ parentID: result.parentID, pluginName: result.pluginName, params: null,
150
+ });
151
+ }
152
+ }
153
+ // 8. Render output
154
+ if (result.feedID) {
155
+ console.log(chalk.green(`Feed created: ${result.feedID}`));
156
+ }
157
+ console.log(chalk.green(`Job scheduled: ${pluginName} (ID: ${result.pluginInstanceID})`));
158
+ console.log(chalk.cyan(`Output will be in: ${result.outputPath}`));
159
+ }
160
+ catch (error) {
161
+ const msg = error instanceof Error ? error.message : String(error);
162
+ console.error(chalk.red(`Error executing plugin: ${msg}`));
163
+ }
164
+ }
165
+ //# sourceMappingURL=pluginExecute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginExecute.js","sourceRoot":"","sources":["../../src/builtins/pluginExecute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Handles proc commands.
3
+ *
4
+ * @param args - command arguments.
5
+ */
6
+ export declare function builtin_proc(args: string[]): Promise<void>;
@@ -0,0 +1,68 @@
1
+ import type { ProcFeed } from '@fnndsc/cumin';
2
+ /**
3
+ * Flat record representing one feed entry for resource-group-style listing.
4
+ * All ProcFeed counter fields exposed as first-class columns.
5
+ */
6
+ export interface ProcJobEntry {
7
+ id: number;
8
+ title: string;
9
+ status: string;
10
+ finishedJobs: number;
11
+ erroredJobs: number;
12
+ startedJobs: number;
13
+ scheduledJobs: number;
14
+ cancelledJobs: number;
15
+ createdJobs: number;
16
+ creationDate: string;
17
+ instances: number | string;
18
+ [key: string]: unknown;
19
+ }
20
+ /** All job fields available for `proc jobs` listing. */
21
+ export declare const ALL_JOB_FIELDS: ReadonlyArray<string>;
22
+ /** Default columns shown for `proc jobs` listing. */
23
+ export declare const DEFAULT_JOB_FIELDS: ReadonlyArray<string>;
24
+ /**
25
+ * Derives an aggregate status label for a feed from its job counters.
26
+ *
27
+ * @param feed - The feed whose counters are inspected.
28
+ * @returns A status label (e.g. `running`, `finishedWithError`).
29
+ */
30
+ export declare function feedStatus_derive(feed: ProcFeed): string;
31
+ /**
32
+ * Colorizes a status label for terminal display.
33
+ *
34
+ * @param status - The status label.
35
+ * @returns The colorized status string.
36
+ */
37
+ export declare function statusColor(status: string): string;
38
+ /**
39
+ * Resolves the selected fields for a listing from a `--fields` argument,
40
+ * falling back to the default set.
41
+ *
42
+ * @param fieldsArg - Comma-separated field names (may be empty).
43
+ * @returns The selected field names.
44
+ */
45
+ export declare function jobFields_select(fieldsArg: string): string[];
46
+ /**
47
+ * Filters job entries by a case-insensitive title substring.
48
+ *
49
+ * @param entries - The entries to filter.
50
+ * @param search - The search substring (empty returns all).
51
+ * @returns The matching entries.
52
+ */
53
+ export declare function procEntries_filterBySearch(entries: ProcJobEntry[], search: string): ProcJobEntry[];
54
+ /**
55
+ * Renders job entries as CSV with quoted fields.
56
+ *
57
+ * @param rows - The entries to render.
58
+ * @param fields - The columns to include, in order.
59
+ * @returns The CSV string (header row plus data rows).
60
+ */
61
+ export declare function procCsv_render(rows: ProcJobEntry[], fields: string[]): string;
62
+ /**
63
+ * Parses a feed identifier of the form `123` or `feed_123`.
64
+ *
65
+ * @param arg - The feed argument.
66
+ * @returns The numeric feed ID, or null if malformed.
67
+ */
68
+ export declare function feedId_parse(arg: string): number | null;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @file Pure helpers for the `proc` builtin.
3
+ *
4
+ * Status derivation/coloring, field selection, search filtering, CSV rendering,
5
+ * and feed-id parsing — all dependency-free (chalk only) for unit testing.
6
+ *
7
+ * @module
8
+ */
9
+ import chalk from 'chalk';
10
+ /** All job fields available for `proc jobs` listing. */
11
+ export const ALL_JOB_FIELDS = [
12
+ 'id', 'title', 'status',
13
+ 'finishedJobs', 'erroredJobs', 'startedJobs',
14
+ 'scheduledJobs', 'cancelledJobs', 'createdJobs',
15
+ 'creationDate', 'instances',
16
+ ];
17
+ /** Default columns shown for `proc jobs` listing. */
18
+ export const DEFAULT_JOB_FIELDS = [
19
+ 'id', 'title', 'status', 'finishedJobs', 'erroredJobs',
20
+ ];
21
+ /**
22
+ * Derives an aggregate status label for a feed from its job counters.
23
+ *
24
+ * @param feed - The feed whose counters are inspected.
25
+ * @returns A status label (e.g. `running`, `finishedWithError`).
26
+ */
27
+ export function feedStatus_derive(feed) {
28
+ if (feed.erroredJobs > 0)
29
+ return 'finishedWithError';
30
+ if (feed.startedJobs + feed.scheduledJobs + feed.createdJobs > 0)
31
+ return 'running';
32
+ if (feed.cancelledJobs > 0 && feed.finishedJobs === 0)
33
+ return 'cancelled';
34
+ if (feed.finishedJobs > 0)
35
+ return 'finishedSuccessfully';
36
+ return 'empty';
37
+ }
38
+ /**
39
+ * Colorizes a status label for terminal display.
40
+ *
41
+ * @param status - The status label.
42
+ * @returns The colorized status string.
43
+ */
44
+ export function statusColor(status) {
45
+ if (status === 'finishedSuccessfully')
46
+ return chalk.green(status);
47
+ if (status === 'finishedWithError')
48
+ return chalk.red(status);
49
+ if (status === 'running')
50
+ return chalk.yellow(status);
51
+ if (status === 'cancelled')
52
+ return chalk.dim(status);
53
+ return chalk.gray(status);
54
+ }
55
+ /**
56
+ * Resolves the selected fields for a listing from a `--fields` argument,
57
+ * falling back to the default set.
58
+ *
59
+ * @param fieldsArg - Comma-separated field names (may be empty).
60
+ * @returns The selected field names.
61
+ */
62
+ export function jobFields_select(fieldsArg) {
63
+ return fieldsArg
64
+ ? fieldsArg.split(',').map((f) => f.trim()).filter(Boolean)
65
+ : [...DEFAULT_JOB_FIELDS];
66
+ }
67
+ /**
68
+ * Filters job entries by a case-insensitive title substring.
69
+ *
70
+ * @param entries - The entries to filter.
71
+ * @param search - The search substring (empty returns all).
72
+ * @returns The matching entries.
73
+ */
74
+ export function procEntries_filterBySearch(entries, search) {
75
+ if (!search)
76
+ return entries;
77
+ const lower = search.toLowerCase();
78
+ return entries.filter((e) => e.title.toLowerCase().includes(lower));
79
+ }
80
+ /**
81
+ * Renders job entries as CSV with quoted fields.
82
+ *
83
+ * @param rows - The entries to render.
84
+ * @param fields - The columns to include, in order.
85
+ * @returns The CSV string (header row plus data rows).
86
+ */
87
+ export function procCsv_render(rows, fields) {
88
+ const header = fields.map((f) => `"${f}"`).join(',');
89
+ const body = rows.map((e) => fields.map((f) => `"${String(e[f] ?? '').replace(/"/g, '""')}"`).join(',')).join('\n');
90
+ return [header, body].join('\n');
91
+ }
92
+ /**
93
+ * Parses a feed identifier of the form `123` or `feed_123`.
94
+ *
95
+ * @param arg - The feed argument.
96
+ * @returns The numeric feed ID, or null if malformed.
97
+ */
98
+ export function feedId_parse(arg) {
99
+ const match = arg.match(/^(?:feed_)?(\d+)$/);
100
+ return match ? parseInt(match[1], 10) : null;
101
+ }
102
+ //# sourceMappingURL=proc.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proc.helpers.js","sourceRoot":"","sources":["../../src/builtins/proc.helpers.ts"],"names":[],"mappings":"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"}