@fnndsc/chell 4.2.8

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/dist/builtins/debug.d.ts +6 -0
  4. package/dist/builtins/debug.js +47 -0
  5. package/dist/builtins/debug.js.map +1 -0
  6. package/dist/builtins/executable.d.ts +22 -0
  7. package/dist/builtins/executable.js +115 -0
  8. package/dist/builtins/executable.js.map +1 -0
  9. package/dist/builtins/fs/cat.d.ts +16 -0
  10. package/dist/builtins/fs/cat.js +249 -0
  11. package/dist/builtins/fs/cat.js.map +1 -0
  12. package/dist/builtins/fs/cd.d.ts +41 -0
  13. package/dist/builtins/fs/cd.js +178 -0
  14. package/dist/builtins/fs/cd.js.map +1 -0
  15. package/dist/builtins/fs/cp.d.ts +7 -0
  16. package/dist/builtins/fs/cp.js +73 -0
  17. package/dist/builtins/fs/cp.js.map +1 -0
  18. package/dist/builtins/fs/download.d.ts +6 -0
  19. package/dist/builtins/fs/download.js +41 -0
  20. package/dist/builtins/fs/download.js.map +1 -0
  21. package/dist/builtins/fs/du.d.ts +58 -0
  22. package/dist/builtins/fs/du.js +210 -0
  23. package/dist/builtins/fs/du.js.map +1 -0
  24. package/dist/builtins/fs/edit.d.ts +7 -0
  25. package/dist/builtins/fs/edit.js +86 -0
  26. package/dist/builtins/fs/edit.js.map +1 -0
  27. package/dist/builtins/fs/ls.d.ts +8 -0
  28. package/dist/builtins/fs/ls.js +68 -0
  29. package/dist/builtins/fs/ls.js.map +1 -0
  30. package/dist/builtins/fs/mkdir.d.ts +6 -0
  31. package/dist/builtins/fs/mkdir.js +38 -0
  32. package/dist/builtins/fs/mkdir.js.map +1 -0
  33. package/dist/builtins/fs/mv.d.ts +7 -0
  34. package/dist/builtins/fs/mv.js +75 -0
  35. package/dist/builtins/fs/mv.js.map +1 -0
  36. package/dist/builtins/fs/pull.args.d.ts +22 -0
  37. package/dist/builtins/fs/pull.args.js +30 -0
  38. package/dist/builtins/fs/pull.args.js.map +1 -0
  39. package/dist/builtins/fs/pull.d.ts +26 -0
  40. package/dist/builtins/fs/pull.js +413 -0
  41. package/dist/builtins/fs/pull.js.map +1 -0
  42. package/dist/builtins/fs/pwd.d.ts +7 -0
  43. package/dist/builtins/fs/pwd.js +75 -0
  44. package/dist/builtins/fs/pwd.js.map +1 -0
  45. package/dist/builtins/fs/rm.d.ts +31 -0
  46. package/dist/builtins/fs/rm.js +148 -0
  47. package/dist/builtins/fs/rm.js.map +1 -0
  48. package/dist/builtins/fs/touch.d.ts +6 -0
  49. package/dist/builtins/fs/touch.js +64 -0
  50. package/dist/builtins/fs/touch.js.map +1 -0
  51. package/dist/builtins/fs/tree.d.ts +15 -0
  52. package/dist/builtins/fs/tree.js +84 -0
  53. package/dist/builtins/fs/tree.js.map +1 -0
  54. package/dist/builtins/fs/upload.d.ts +6 -0
  55. package/dist/builtins/fs/upload.js +45 -0
  56. package/dist/builtins/fs/upload.js.map +1 -0
  57. package/dist/builtins/help.d.ts +74 -0
  58. package/dist/builtins/help.js +1217 -0
  59. package/dist/builtins/help.js.map +1 -0
  60. package/dist/builtins/index.d.ts +45 -0
  61. package/dist/builtins/index.js +45 -0
  62. package/dist/builtins/index.js.map +1 -0
  63. package/dist/builtins/net/connect.d.ts +7 -0
  64. package/dist/builtins/net/connect.js +42 -0
  65. package/dist/builtins/net/connect.js.map +1 -0
  66. package/dist/builtins/net/cubepath.d.ts +18 -0
  67. package/dist/builtins/net/cubepath.js +102 -0
  68. package/dist/builtins/net/cubepath.js.map +1 -0
  69. package/dist/builtins/net/logout.d.ts +6 -0
  70. package/dist/builtins/net/logout.js +24 -0
  71. package/dist/builtins/net/logout.js.map +1 -0
  72. package/dist/builtins/net/pacs.d.ts +24 -0
  73. package/dist/builtins/net/pacs.js +121 -0
  74. package/dist/builtins/net/pacs.js.map +1 -0
  75. package/dist/builtins/net/pacsUtils.d.ts +85 -0
  76. package/dist/builtins/net/pacsUtils.js +184 -0
  77. package/dist/builtins/net/pacsUtils.js.map +1 -0
  78. package/dist/builtins/net/query.d.ts +60 -0
  79. package/dist/builtins/net/query.js +304 -0
  80. package/dist/builtins/net/query.js.map +1 -0
  81. package/dist/builtins/parametersofplugin.d.ts +13 -0
  82. package/dist/builtins/parametersofplugin.js +43 -0
  83. package/dist/builtins/parametersofplugin.js.map +1 -0
  84. package/dist/builtins/pluginExecute.d.ts +27 -0
  85. package/dist/builtins/pluginExecute.js +165 -0
  86. package/dist/builtins/pluginExecute.js.map +1 -0
  87. package/dist/builtins/proc.d.ts +6 -0
  88. package/dist/builtins/proc.helpers.d.ts +68 -0
  89. package/dist/builtins/proc.helpers.js +102 -0
  90. package/dist/builtins/proc.helpers.js.map +1 -0
  91. package/dist/builtins/proc.js +289 -0
  92. package/dist/builtins/proc.js.map +1 -0
  93. package/dist/builtins/res/compute.d.ts +6 -0
  94. package/dist/builtins/res/compute.js +55 -0
  95. package/dist/builtins/res/compute.js.map +1 -0
  96. package/dist/builtins/res/feed.d.ts +6 -0
  97. package/dist/builtins/res/feed.js +244 -0
  98. package/dist/builtins/res/feed.js.map +1 -0
  99. package/dist/builtins/res/feed.notes.d.ts +28 -0
  100. package/dist/builtins/res/feed.notes.js +24 -0
  101. package/dist/builtins/res/feed.notes.js.map +1 -0
  102. package/dist/builtins/res/files.d.ts +18 -0
  103. package/dist/builtins/res/files.js +85 -0
  104. package/dist/builtins/res/files.js.map +1 -0
  105. package/dist/builtins/res/group.d.ts +6 -0
  106. package/dist/builtins/res/group.js +54 -0
  107. package/dist/builtins/res/group.js.map +1 -0
  108. package/dist/builtins/res/pipeline.args.d.ts +22 -0
  109. package/dist/builtins/res/pipeline.args.js +28 -0
  110. package/dist/builtins/res/pipeline.args.js.map +1 -0
  111. package/dist/builtins/res/pipeline.d.ts +20 -0
  112. package/dist/builtins/res/pipeline.js +252 -0
  113. package/dist/builtins/res/pipeline.js.map +1 -0
  114. package/dist/builtins/res/plugin.d.ts +13 -0
  115. package/dist/builtins/res/plugin.js +140 -0
  116. package/dist/builtins/res/plugin.js.map +1 -0
  117. package/dist/builtins/res/plugininstance.d.ts +6 -0
  118. package/dist/builtins/res/plugininstance.js +53 -0
  119. package/dist/builtins/res/plugininstance.js.map +1 -0
  120. package/dist/builtins/res/pluginmeta.d.ts +6 -0
  121. package/dist/builtins/res/pluginmeta.js +53 -0
  122. package/dist/builtins/res/pluginmeta.js.map +1 -0
  123. package/dist/builtins/res/tag.d.ts +6 -0
  124. package/dist/builtins/res/tag.js +53 -0
  125. package/dist/builtins/res/tag.js.map +1 -0
  126. package/dist/builtins/res/workflow.d.ts +6 -0
  127. package/dist/builtins/res/workflow.js +53 -0
  128. package/dist/builtins/res/workflow.js.map +1 -0
  129. package/dist/builtins/store.d.ts +6 -0
  130. package/dist/builtins/store.js +108 -0
  131. package/dist/builtins/store.js.map +1 -0
  132. package/dist/builtins/sys/context.d.ts +6 -0
  133. package/dist/builtins/sys/context.js +50 -0
  134. package/dist/builtins/sys/context.js.map +1 -0
  135. package/dist/builtins/sys/physicalmode.d.ts +6 -0
  136. package/dist/builtins/sys/physicalmode.js +41 -0
  137. package/dist/builtins/sys/physicalmode.js.map +1 -0
  138. package/dist/builtins/sys/prompt.d.ts +13 -0
  139. package/dist/builtins/sys/prompt.helpers.d.ts +31 -0
  140. package/dist/builtins/sys/prompt.helpers.js +36 -0
  141. package/dist/builtins/sys/prompt.helpers.js.map +1 -0
  142. package/dist/builtins/sys/prompt.js +182 -0
  143. package/dist/builtins/sys/prompt.js.map +1 -0
  144. package/dist/builtins/sys/timing.d.ts +6 -0
  145. package/dist/builtins/sys/timing.js +41 -0
  146. package/dist/builtins/sys/timing.js.map +1 -0
  147. package/dist/builtins/sys/whoami.d.ts +12 -0
  148. package/dist/builtins/sys/whoami.js +37 -0
  149. package/dist/builtins/sys/whoami.js.map +1 -0
  150. package/dist/builtins/utils.d.ts +55 -0
  151. package/dist/builtins/utils.js +145 -0
  152. package/dist/builtins/utils.js.map +1 -0
  153. package/dist/builtins/wildcard.d.ts +26 -0
  154. package/dist/builtins/wildcard.js +120 -0
  155. package/dist/builtins/wildcard.js.map +1 -0
  156. package/dist/chell.d.ts +16 -0
  157. package/dist/chell.js +1193 -0
  158. package/dist/chell.js.map +1 -0
  159. package/dist/command-keys.d.ts +8 -0
  160. package/dist/command-keys.js +32 -0
  161. package/dist/command-keys.js.map +1 -0
  162. package/dist/config/settings.d.ts +39 -0
  163. package/dist/config/settings.js +93 -0
  164. package/dist/config/settings.js.map +1 -0
  165. package/dist/core/bootFlags.d.ts +32 -0
  166. package/dist/core/bootFlags.js +25 -0
  167. package/dist/core/bootFlags.js.map +1 -0
  168. package/dist/core/cli.d.ts +58 -0
  169. package/dist/core/cli.js +251 -0
  170. package/dist/core/cli.js.map +1 -0
  171. package/dist/core/prompt/index.d.ts +80 -0
  172. package/dist/core/prompt/index.js +29 -0
  173. package/dist/core/prompt/index.js.map +1 -0
  174. package/dist/core/prompt/theme_default.d.ts +19 -0
  175. package/dist/core/prompt/theme_default.js +47 -0
  176. package/dist/core/prompt/theme_default.js.map +1 -0
  177. package/dist/core/prompt/theme_p10k.d.ts +22 -0
  178. package/dist/core/prompt/theme_p10k.js +164 -0
  179. package/dist/core/prompt/theme_p10k.js.map +1 -0
  180. package/dist/core/prompt/utils.d.ts +23 -0
  181. package/dist/core/prompt/utils.js +40 -0
  182. package/dist/core/prompt/utils.js.map +1 -0
  183. package/dist/core/question.d.ts +34 -0
  184. package/dist/core/question.js +76 -0
  185. package/dist/core/question.js.map +1 -0
  186. package/dist/core/repl.d.ts +31 -0
  187. package/dist/core/repl.js +146 -0
  188. package/dist/core/repl.js.map +1 -0
  189. package/dist/index.d.ts +7 -0
  190. package/dist/index.js +34 -0
  191. package/dist/index.js.map +1 -0
  192. package/dist/lib/bootsequence.d.ts +62 -0
  193. package/dist/lib/bootsequence.js +222 -0
  194. package/dist/lib/bootsequence.js.map +1 -0
  195. package/dist/lib/completer/index.d.ts +15 -0
  196. package/dist/lib/completer/index.js +212 -0
  197. package/dist/lib/completer/index.js.map +1 -0
  198. package/dist/lib/completer/pathComplete.helpers.d.ts +22 -0
  199. package/dist/lib/completer/pathComplete.helpers.js +49 -0
  200. package/dist/lib/completer/pathComplete.helpers.js.map +1 -0
  201. package/dist/lib/logo.d.ts +47 -0
  202. package/dist/lib/logo.js +313 -0
  203. package/dist/lib/logo.js.map +1 -0
  204. package/dist/lib/parser.d.ts +13 -0
  205. package/dist/lib/parser.js +52 -0
  206. package/dist/lib/parser.js.map +1 -0
  207. package/dist/lib/pipe.d.ts +11 -0
  208. package/dist/lib/pipe.js +90 -0
  209. package/dist/lib/pipe.js.map +1 -0
  210. package/dist/lib/prefetch.d.ts +25 -0
  211. package/dist/lib/prefetch.js +64 -0
  212. package/dist/lib/prefetch.js.map +1 -0
  213. package/dist/lib/semicolonParser.d.ts +22 -0
  214. package/dist/lib/semicolonParser.js +53 -0
  215. package/dist/lib/semicolonParser.js.map +1 -0
  216. package/dist/lib/spinner.d.ts +23 -0
  217. package/dist/lib/spinner.js +68 -0
  218. package/dist/lib/spinner.js.map +1 -0
  219. package/dist/lib/vfs/providers/static.d.ts +65 -0
  220. package/dist/lib/vfs/providers/static.js +164 -0
  221. package/dist/lib/vfs/providers/static.js.map +1 -0
  222. package/dist/lib/vfs/providers/static_content.d.ts +27 -0
  223. package/dist/lib/vfs/providers/static_content.js +180 -0
  224. package/dist/lib/vfs/providers/static_content.js.map +1 -0
  225. package/dist/lib/vfs/vfs.d.ts +59 -0
  226. package/dist/lib/vfs/vfs.js +198 -0
  227. package/dist/lib/vfs/vfs.js.map +1 -0
  228. package/dist/session/index.d.ts +76 -0
  229. package/dist/session/index.js +120 -0
  230. package/dist/session/index.js.map +1 -0
  231. package/package.json +65 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @file Pure argument parsing for the `pull` builtin.
3
+ *
4
+ * Dependency-free so it is trivially unit-testable.
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Parses `pull` arguments: the `--nowait` flag, `--retry N`, and path operands.
10
+ *
11
+ * @param args - Raw command arguments.
12
+ * @returns The parsed flags and paths.
13
+ */
14
+ export function pullArgs_parse(args) {
15
+ const nowait = args.includes('--nowait');
16
+ let retryMax = 0;
17
+ const paths = [];
18
+ for (let i = 0; i < args.length; i++) {
19
+ if (args[i] === '--retry' && i + 1 < args.length) {
20
+ const n = parseInt(args[++i], 10);
21
+ if (!isNaN(n) && n >= 0)
22
+ retryMax = n;
23
+ }
24
+ else if (!args[i].startsWith('--')) {
25
+ paths.push(args[i]);
26
+ }
27
+ }
28
+ return { nowait, retryMax, paths };
29
+ }
30
+ //# sourceMappingURL=pull.args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.args.js","sourceRoot":"","sources":["../../../src/builtins/fs/pull.args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,MAAM,GAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,QAAQ,GAAW,CAAC,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,CAAC,GAAW,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @file Builtin pull command.
3
+ *
4
+ * Blocking PACS series retrieve with parallel execution and per-series MultiBar progress.
5
+ * Accepts one or more `/net/pacs/queries/...` VFS paths (query, study, or series level)
6
+ * and materialises the matching DICOM series into ChRIS storage.
7
+ *
8
+ * Progress is driven by LONK WebSocket push notifications (api/v1/pacs/ws/).
9
+ * Use `--retry N` to automatically re-fire retrieves for series that received no LONK activity.
10
+ *
11
+ * @module
12
+ */
13
+ /**
14
+ * Pulls one or more `/net/pacs/queries/...` VFS paths into ChRIS storage.
15
+ *
16
+ * Blocking by default: shows per-series MultiBar progress via LONK WebSocket,
17
+ * exits non-zero on partial failure.
18
+ * With `--nowait`: fires retrieves and prints `<seriesUID> <retrieveId>` per line, then returns.
19
+ * With `--retry N`: re-fires retrieves for [NO LONK] series up to N additional times.
20
+ *
21
+ * @param args - Command arguments (VFS paths, optional flags).
22
+ * @example
23
+ * pull /net/pacs/queries/42_AccessionNumber:22548684
24
+ * pull --retry 3 /net/pacs/queries/42_AccessionNumber:22548684/Study_1.2.3_US-Hips
25
+ */
26
+ export declare function builtin_pull(args: string[]): Promise<void>;
@@ -0,0 +1,413 @@
1
+ /**
2
+ * @file Builtin pull command.
3
+ *
4
+ * Blocking PACS series retrieve with parallel execution and per-series MultiBar progress.
5
+ * Accepts one or more `/net/pacs/queries/...` VFS paths (query, study, or series level)
6
+ * and materialises the matching DICOM series into ChRIS storage.
7
+ *
8
+ * Progress is driven by LONK WebSocket push notifications (api/v1/pacs/ws/).
9
+ * Use `--retry N` to automatically re-fire retrieves for series that received no LONK activity.
10
+ *
11
+ * @module
12
+ */
13
+ import chalk from 'chalk';
14
+ import cliProgress from 'cli-progress';
15
+ import WebSocket from 'ws';
16
+ import { pacsQueries_create, pacsRetrieve_create, } from '@fnndsc/cumin';
17
+ import { session } from '../../session/index.js';
18
+ import { args_checkHasHelpFlag, help_show } from '../help.js';
19
+ import { pacsQuery_createAndWait, queryExpr_parse } from '../net/query.js';
20
+ import { spinner } from '../../lib/spinner.js';
21
+ import { path_resolve } from '../utils.js';
22
+ import { pacs_seriesCollect, pacsServer_resolve, series_cubePathGet, } from '../net/pacsUtils.js';
23
+ import { builtin_cubepath } from '../net/cubepath.js';
24
+ import { pullArgs_parse } from './pull.args.js';
25
+ const STALL_TIMEOUT_MS = 30_000;
26
+ const NO_ACTIVITY_TIMEOUT_MS = 15_000;
27
+ const SERIES_TIMEOUT_MS = 5 * 60 * 1_000;
28
+ const CHECKER_INTERVAL_MS = 2_000;
29
+ /**
30
+ * Walks a VFS path and returns SeriesPullTask array, delegating collection to pacsUtils.
31
+ *
32
+ * @param pathStr - Absolute VFS path to a query, study, or series directory.
33
+ * @param fallbackPacsName - PACS identifier used when RetrieveAETitle is absent.
34
+ * @returns Array of SeriesPullTask ready for firing.
35
+ */
36
+ async function path_seriesCollect(pathStr, fallbackPacsName) {
37
+ const infos = await pacs_seriesCollect(pathStr, fallbackPacsName, 'pull');
38
+ return infos.map((info) => ({
39
+ label: info.label,
40
+ seriesUID: info.seriesUID,
41
+ studyUID: info.studyUID,
42
+ pacsName: info.pacsName,
43
+ expectedFiles: info.expectedFiles,
44
+ syntheticQueryId: null,
45
+ retrieveId: null,
46
+ status: 'pending',
47
+ actualFiles: 0,
48
+ lastProgressFiles: 0,
49
+ lastProgressTime: Date.now(),
50
+ startTime: 0,
51
+ lonkConfirmed: false,
52
+ cubePathDir: null,
53
+ }));
54
+ }
55
+ /**
56
+ * Creates a synthetic PACSQuery + PACSRetrieve for a single series.
57
+ *
58
+ * @param task - The pull task to fire (mutated in place: syntheticQueryId, retrieveId, startTime).
59
+ * @param pacsserver - Resolved PACS server ID string.
60
+ */
61
+ async function task_fire(task, pacsserver) {
62
+ const queryData = {
63
+ title: `pull_${task.seriesUID}`,
64
+ query: JSON.stringify({
65
+ SeriesInstanceUID: task.seriesUID,
66
+ StudyInstanceUID: task.studyUID,
67
+ }),
68
+ execute: false,
69
+ };
70
+ const queryResult = await pacsQueries_create(pacsserver, queryData);
71
+ if (!queryResult.ok) {
72
+ task.status = 'error';
73
+ return;
74
+ }
75
+ const syntheticQueryId = queryResult.value.id;
76
+ const retrieveResult = await pacsRetrieve_create(syntheticQueryId);
77
+ if (!retrieveResult.ok) {
78
+ task.status = 'error';
79
+ return;
80
+ }
81
+ task.syntheticQueryId = syntheticQueryId;
82
+ task.retrieveId = retrieveResult.value.id;
83
+ task.startTime = Date.now();
84
+ }
85
+ /**
86
+ * Constructs a LONK WebSocket URL from a download token response.
87
+ *
88
+ * @param tokenUrl - The download token resource URL.
89
+ * @param token - The actual download token string.
90
+ * @returns WebSocket URL for the LONK endpoint.
91
+ */
92
+ function lonkWsUrl_build(tokenUrl, token) {
93
+ return tokenUrl
94
+ .replace(/^http(s?):\/\//, (_m, s) => `ws${s}://`)
95
+ .replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/ws/?token=${token}`);
96
+ }
97
+ /**
98
+ * Opens a LONK WebSocket, fires retrieves for the given tasks, and blocks until all
99
+ * tasks reach a terminal state. Mutates each task's status, actualFiles, and lonkConfirmed.
100
+ *
101
+ * @param tasks - Tasks to subscribe, fire, and watch.
102
+ * @param pacsserver - Resolved PACS server identifier.
103
+ * @param client - Authenticated ChRIS API client.
104
+ * @returns Number of tasks that failed to fire their retrieve.
105
+ */
106
+ async function tasks_pullWatch(tasks, pacsserver, client) {
107
+ const tokenClient = client;
108
+ const downloadToken = await tokenClient.createDownloadToken();
109
+ const tokenStr = String(downloadToken.data.token ?? '');
110
+ const wsUrl = lonkWsUrl_build(downloadToken.url, tokenStr);
111
+ const ws = new WebSocket(wsUrl);
112
+ await new Promise((openResolve, openReject) => {
113
+ ws.once('open', openResolve);
114
+ ws.once('error', (err) => openReject(err));
115
+ });
116
+ for (const t of tasks) {
117
+ ws.send(JSON.stringify({
118
+ SeriesInstanceUID: t.seriesUID,
119
+ pacs_name: t.pacsName,
120
+ action: 'subscribe',
121
+ }));
122
+ }
123
+ await Promise.all(tasks.map((t) => task_fire(t, pacsserver)));
124
+ const fired = tasks.filter((t) => t.status !== 'error');
125
+ const firingErrors = tasks.length - fired.length;
126
+ if (fired.length === 0) {
127
+ ws.close();
128
+ return firingErrors;
129
+ }
130
+ const multiBar = new cliProgress.MultiBar({
131
+ format: ' {label}> [{bar}] {value}/{total}',
132
+ barCompleteChar: '█',
133
+ barIncompleteChar: '░',
134
+ hideCursor: true,
135
+ clearOnComplete: false,
136
+ stopOnComplete: false,
137
+ noTTYOutput: true,
138
+ }, cliProgress.Presets.shades_classic);
139
+ const barMap = new Map();
140
+ for (const t of tasks) {
141
+ const bar = multiBar.create(Math.max(t.expectedFiles, 1), 0, { label: t.label });
142
+ barMap.set(t, bar);
143
+ }
144
+ const taskByUID = new Map(tasks.map((t) => [t.seriesUID, t]));
145
+ await new Promise((resolve) => {
146
+ let resolved = false;
147
+ const done = () => {
148
+ if (resolved)
149
+ return;
150
+ resolved = true;
151
+ clearInterval(checker);
152
+ try {
153
+ ws.close();
154
+ }
155
+ catch { /* ignore */ }
156
+ resolve();
157
+ };
158
+ const checker = setInterval(() => {
159
+ const now = Date.now();
160
+ let allTerminal = true;
161
+ for (const t of fired) {
162
+ if (t.status === 'pulled' || t.status === 'error' || t.status === 'stalled' || t.status === 'timeout') {
163
+ continue;
164
+ }
165
+ allTerminal = false;
166
+ const bar = barMap.get(t);
167
+ if (t.startTime > 0 && now - t.startTime > SERIES_TIMEOUT_MS) {
168
+ t.status = 'timeout';
169
+ bar?.update(t.actualFiles, { label: `${t.label} [TIMEOUT]` });
170
+ continue;
171
+ }
172
+ if (t.actualFiles > 0 && now - t.lastProgressTime > STALL_TIMEOUT_MS) {
173
+ t.status = 'stalled';
174
+ bar?.update(t.actualFiles, { label: `${t.label} [STALLED]` });
175
+ continue;
176
+ }
177
+ if (t.startTime > 0 && t.actualFiles === 0 && now - t.startTime > NO_ACTIVITY_TIMEOUT_MS) {
178
+ t.status = 'pulled';
179
+ t.lonkConfirmed = false;
180
+ bar?.update(Math.max(t.expectedFiles, 1), { label: `${t.label} [NO LONK]` });
181
+ continue;
182
+ }
183
+ }
184
+ if (allTerminal)
185
+ done();
186
+ }, CHECKER_INTERVAL_MS);
187
+ ws.on('message', (data) => {
188
+ try {
189
+ const outer = JSON.parse(data.toString());
190
+ const seriesUID = outer.SeriesInstanceUID;
191
+ const message = outer.message;
192
+ if (!seriesUID || !message)
193
+ return;
194
+ const t = taskByUID.get(seriesUID);
195
+ if (!t)
196
+ return;
197
+ const bar = barMap.get(t);
198
+ if ('ndicom' in message && typeof message.ndicom === 'number') {
199
+ const n = message.ndicom;
200
+ t.actualFiles = n;
201
+ t.lastProgressFiles = n;
202
+ t.lastProgressTime = Date.now();
203
+ if (t.status === 'pending')
204
+ t.status = 'pulling';
205
+ const total = t.expectedFiles > 0 ? t.expectedFiles : Math.max(n, 1);
206
+ bar?.setTotal(total);
207
+ bar?.update(n);
208
+ }
209
+ else if ('done' in message && message.done === true) {
210
+ t.status = 'pulled';
211
+ t.lonkConfirmed = true;
212
+ const finalTotal = t.expectedFiles > 0 ? t.expectedFiles : t.actualFiles || 1;
213
+ bar?.setTotal(finalTotal);
214
+ bar?.update(finalTotal, { label: `${t.label} [DONE]` });
215
+ }
216
+ else if ('error' in message && typeof message.error === 'string') {
217
+ t.status = 'error';
218
+ bar?.update(t.actualFiles, { label: `${t.label} [ERROR]` });
219
+ }
220
+ }
221
+ catch {
222
+ // Malformed message — ignore
223
+ }
224
+ });
225
+ ws.on('error', () => {
226
+ for (const t of fired) {
227
+ if (t.status === 'pending' || t.status === 'pulling') {
228
+ t.status = 'error';
229
+ barMap.get(t)?.update(t.actualFiles, { label: `${t.label} [WS ERROR]` });
230
+ }
231
+ }
232
+ done();
233
+ });
234
+ ws.on('close', () => { done(); });
235
+ });
236
+ multiBar.stop();
237
+ return firingErrors;
238
+ }
239
+ /**
240
+ * Resolves raw path/query arguments to concrete `/net/pacs` VFS paths,
241
+ * running PACS queries for query expressions.
242
+ *
243
+ * @param paths - Raw path or query-expression operands.
244
+ * @param pacsserver - The resolved PACS server identifier.
245
+ * @returns The resolved VFS paths.
246
+ */
247
+ async function paths_resolveToVfs(paths, pacsserver) {
248
+ const resolvedPaths = [];
249
+ for (const rawPath of paths) {
250
+ const p = rawPath.startsWith('/') ? rawPath : await path_resolve(rawPath);
251
+ if (p.startsWith('/net/pacs')) {
252
+ resolvedPaths.push(p);
253
+ }
254
+ else if (queryExpr_parse(rawPath)) {
255
+ spinner.start(`Querying PACS for ${p}...`, true);
256
+ const qResult = await pacsQuery_createAndWait(p, `pull_${p}`, pacsserver, (msg) => spinner.updateMessage(msg));
257
+ spinner.stop();
258
+ if (qResult) {
259
+ console.log(chalk.gray(` → ${qResult.vfsPath}`));
260
+ resolvedPaths.push(qResult.vfsPath);
261
+ }
262
+ else {
263
+ console.error(chalk.red(`pull: Query failed for: ${p}`));
264
+ }
265
+ }
266
+ else {
267
+ console.error(chalk.red(`pull: Not a PACS VFS path or valid query expression: ${rawPath}`));
268
+ }
269
+ }
270
+ return resolvedPaths;
271
+ }
272
+ /**
273
+ * Re-fires retrieves for series that pulled without LONK confirmation, up to
274
+ * `retryMax` additional attempts, then permanently fails any still unconfirmed.
275
+ *
276
+ * @param allTasks - All pull tasks.
277
+ * @param retryMax - Maximum retry attempts.
278
+ * @param pacsserver - The PACS server identifier.
279
+ * @param client - The connected ChRIS client.
280
+ * @returns The number of additional retrieve-firing errors incurred.
281
+ */
282
+ async function pullRetryLoop(allTasks, retryMax, pacsserver, client) {
283
+ let extraFiringErrors = 0;
284
+ let retryCandidates = allTasks.filter((t) => t.status === 'pulled' && !t.lonkConfirmed);
285
+ const pacsClient = client;
286
+ for (let attempt = 1; attempt <= retryMax && retryCandidates.length > 0; attempt++) {
287
+ await Promise.all(retryCandidates.map(async (t) => {
288
+ const result = await series_cubePathGet(t.seriesUID, pacsClient, 1, 0);
289
+ if (result) {
290
+ t.lonkConfirmed = true;
291
+ t.cubePathDir = result.folderPath;
292
+ }
293
+ }));
294
+ retryCandidates = retryCandidates.filter((t) => !t.lonkConfirmed);
295
+ if (retryCandidates.length === 0)
296
+ break;
297
+ console.log(chalk.yellow(`\nRetry ${attempt}/${retryMax} for ${retryCandidates.length} unconfirmed series...`));
298
+ for (const t of retryCandidates) {
299
+ t.status = 'pending';
300
+ t.actualFiles = 0;
301
+ t.lastProgressFiles = 0;
302
+ t.lastProgressTime = Date.now();
303
+ t.startTime = 0;
304
+ t.lonkConfirmed = false;
305
+ t.syntheticQueryId = null;
306
+ t.retrieveId = null;
307
+ }
308
+ extraFiringErrors += await tasks_pullWatch(retryCandidates, pacsserver, client);
309
+ retryCandidates = retryCandidates.filter((t) => t.status === 'pulled' && !t.lonkConfirmed);
310
+ }
311
+ for (const t of retryCandidates) {
312
+ t.status = 'error';
313
+ }
314
+ return extraFiringErrors;
315
+ }
316
+ /**
317
+ * Prints the pull summary and sets a non-zero exit code on any failure.
318
+ *
319
+ * @param allTasks - All pull tasks.
320
+ * @param totalFiringErrors - Count of retrieve-firing errors across all attempts.
321
+ */
322
+ function pullSummary_print(allTasks, totalFiringErrors) {
323
+ const pulled = allTasks.filter((t) => t.status === 'pulled').length;
324
+ const totalCount = allTasks.length;
325
+ const failures = allTasks.filter((t) => t.status !== 'pulled');
326
+ if (failures.length === 0) {
327
+ console.log(chalk.green(`\n✓ ${pulled}/${totalCount} series pulled successfully.`));
328
+ }
329
+ else {
330
+ console.log(chalk.yellow(`\n⚠ ${pulled}/${totalCount} series complete.`));
331
+ for (const f of failures) {
332
+ console.log(chalk.red(` ✗ ${f.label} [${f.status.toUpperCase()}]`));
333
+ }
334
+ process.exitCode = 1;
335
+ }
336
+ if (totalFiringErrors > 0) {
337
+ console.log(chalk.red(` ${totalFiringErrors} retrieve(s) failed to start.`));
338
+ process.exitCode = 1;
339
+ }
340
+ }
341
+ /**
342
+ * Pulls one or more `/net/pacs/queries/...` VFS paths into ChRIS storage.
343
+ *
344
+ * Blocking by default: shows per-series MultiBar progress via LONK WebSocket,
345
+ * exits non-zero on partial failure.
346
+ * With `--nowait`: fires retrieves and prints `<seriesUID> <retrieveId>` per line, then returns.
347
+ * With `--retry N`: re-fires retrieves for [NO LONK] series up to N additional times.
348
+ *
349
+ * @param args - Command arguments (VFS paths, optional flags).
350
+ * @example
351
+ * pull /net/pacs/queries/42_AccessionNumber:22548684
352
+ * pull --retry 3 /net/pacs/queries/42_AccessionNumber:22548684/Study_1.2.3_US-Hips
353
+ */
354
+ export async function builtin_pull(args) {
355
+ if (args_checkHasHelpFlag(args, 'pull')) {
356
+ help_show('pull');
357
+ return;
358
+ }
359
+ const { nowait, retryMax, paths } = pullArgs_parse(args);
360
+ if (paths.length === 0) {
361
+ console.error(chalk.red('pull: No paths specified. Usage: pull [--nowait] [--retry N] <vfs-path> [...]'));
362
+ process.exitCode = 1;
363
+ return;
364
+ }
365
+ const pacsIdentifier = await pacsServer_resolve();
366
+ if (!pacsIdentifier) {
367
+ console.error(chalk.red('pull: No PACS server available. Set one with: pacs connect <id>'));
368
+ process.exitCode = 1;
369
+ return;
370
+ }
371
+ const pacsserver = pacsIdentifier;
372
+ const resolvedPaths = await paths_resolveToVfs(paths, pacsserver);
373
+ const allTasks = [];
374
+ for (const p of resolvedPaths) {
375
+ const tasks = await path_seriesCollect(p, pacsIdentifier);
376
+ if (tasks.length === 0) {
377
+ console.error(chalk.yellow(`pull: No series found under: ${p}`));
378
+ }
379
+ allTasks.push(...tasks);
380
+ }
381
+ if (allTasks.length === 0) {
382
+ console.error(chalk.red('pull: No series to retrieve.'));
383
+ process.exitCode = 1;
384
+ return;
385
+ }
386
+ const client = await session.connection.client_get();
387
+ if (!client) {
388
+ console.error(chalk.red('pull: Not connected to ChRIS.'));
389
+ process.exitCode = 1;
390
+ return;
391
+ }
392
+ // --nowait: fire retrieves and exit without watching
393
+ if (nowait) {
394
+ for (const t of allTasks) {
395
+ await task_fire(t, pacsserver);
396
+ if (t.retrieveId !== null) {
397
+ console.log(`${t.seriesUID} ${t.retrieveId}`);
398
+ }
399
+ else {
400
+ console.log(`${t.seriesUID} ERROR`);
401
+ process.exitCode = 1;
402
+ }
403
+ }
404
+ return;
405
+ }
406
+ let totalFiringErrors = await tasks_pullWatch(allTasks, pacsserver, client);
407
+ totalFiringErrors += await pullRetryLoop(allTasks, retryMax, pacsserver, client);
408
+ pullSummary_print(allTasks, totalFiringErrors);
409
+ // Report CUBE paths via cubepath; --retry handles pacsseries DB lag post-pull
410
+ await builtin_cubepath([...resolvedPaths, '--retry']);
411
+ console.log(chalk.gray('Detached — use `pacsretrieve report <queryId>` to verify.'));
412
+ }
413
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/builtins/fs/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Prints the current working directory in the ChRIS filesystem context.
3
+ *
4
+ * @param args - Command arguments (--title flag supported).
5
+ * @returns A Promise that resolves when the directory is printed.
6
+ */
7
+ export declare function builtin_pwd(args?: string[]): Promise<void>;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @file Builtin pwd command.
3
+ * Prints the current working directory.
4
+ */
5
+ import { session } from '../../session/index.js';
6
+ import { feeds_list, pluginInstances_list } from '@fnndsc/salsa';
7
+ /**
8
+ * Prints the current working directory in the ChRIS filesystem context.
9
+ *
10
+ * @param args - Command arguments (--title flag supported).
11
+ * @returns A Promise that resolves when the directory is printed.
12
+ */
13
+ export async function builtin_pwd(args = []) {
14
+ const showTitles = args.includes('--title');
15
+ const cwd = await session.getCWD();
16
+ if (!showTitles) {
17
+ console.log(cwd);
18
+ return;
19
+ }
20
+ // Replace feed and plugin patterns with titles
21
+ const titlePath = await path_withTitles(cwd);
22
+ console.log(titlePath);
23
+ }
24
+ /**
25
+ * Replaces feed_XXXX and pl-<name>_XXXX patterns in a path with their titles.
26
+ *
27
+ * @param path - The path to process.
28
+ * @returns The path with titles replacing directory names.
29
+ */
30
+ async function path_withTitles(path) {
31
+ const parts = path.split('/');
32
+ const replacedParts = await Promise.all(parts.map(async (part) => {
33
+ // Pattern 1: feed_XXXX
34
+ const feedMatch = part.match(/^feed_(\d+)$/);
35
+ if (feedMatch) {
36
+ const feedId = parseInt(feedMatch[1], 10);
37
+ try {
38
+ const feedData = await feeds_list({ id: feedId, limit: 1 });
39
+ if (feedData && feedData.tableData && feedData.tableData.length > 0) {
40
+ const feed = feedData.tableData[0];
41
+ if (feed && typeof feed.name === 'string') {
42
+ return feed.name;
43
+ }
44
+ }
45
+ }
46
+ catch (e) {
47
+ // Silently ignore errors
48
+ }
49
+ return part;
50
+ }
51
+ // Pattern 2: pl-<name>_XXXX
52
+ const pluginMatch = part.match(/^(pl-.+)_(\d+)$/);
53
+ if (pluginMatch) {
54
+ const pluginInstanceId = parseInt(pluginMatch[2], 10);
55
+ try {
56
+ const instanceData = await pluginInstances_list({ id: pluginInstanceId, limit: 1 });
57
+ if (instanceData && instanceData.tableData && instanceData.tableData.length > 0) {
58
+ const instance = instanceData.tableData[0];
59
+ if (instance) {
60
+ const pluginName = typeof instance.plugin_name === 'string' ? instance.plugin_name : '';
61
+ const pluginVersion = typeof instance.plugin_version === 'string' ? instance.plugin_version : '';
62
+ return pluginVersion ? `${pluginName} v${pluginVersion}` : pluginName;
63
+ }
64
+ }
65
+ }
66
+ catch (e) {
67
+ // Silently ignore errors
68
+ }
69
+ return part;
70
+ }
71
+ return part; // Return unchanged if no match
72
+ }));
73
+ return replacedParts.join('/');
74
+ }
75
+ //# sourceMappingURL=pwd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwd.js","sourceRoot":"","sources":["../../../src/builtins/fs/pwd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Parsed `rm` arguments: flags plus the resolved list of path operands.
3
+ */
4
+ export interface RmArgs {
5
+ recursive: boolean;
6
+ force: boolean;
7
+ interactive: boolean;
8
+ paths: string[];
9
+ }
10
+ /**
11
+ * Parses `rm` arguments, supporting combined short flags (`-rf`, `-rfi`) and the
12
+ * `--` end-of-options separator.
13
+ *
14
+ * @param args - Raw command arguments.
15
+ * @returns The parsed flags and path operands.
16
+ */
17
+ export declare function rmArgs_parse(args: string[]): RmArgs;
18
+ /**
19
+ * Formats the multi-target removal summary line.
20
+ *
21
+ * @param successCount - Number of items removed successfully.
22
+ * @param failCount - Number of items that failed to remove.
23
+ * @returns The summary string, or null if there is nothing to summarise.
24
+ */
25
+ export declare function rmSummary_format(successCount: number, failCount: number): string | null;
26
+ /**
27
+ * Removes one or more files or directories.
28
+ *
29
+ * @param args - Command line arguments (flags and paths).
30
+ */
31
+ export declare function builtin_rm(args: string[]): Promise<void>;