@fnndsc/chell 4.3.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builtins/sys/prompt.js +2 -2
- package/dist/builtins/sys/prompt.js.map +1 -1
- package/dist/chell.d.ts +2 -1
- package/dist/chell.js +2 -1
- package/dist/chell.js.map +1 -1
- package/dist/config/settings.d.ts +4 -2
- package/dist/config/settings.js +7 -2
- package/dist/config/settings.js.map +1 -1
- package/dist/core/boot.d.ts +3 -1
- package/dist/core/boot.js +93 -154
- package/dist/core/boot.js.map +1 -1
- package/dist/core/cli.d.ts +3 -1
- package/dist/core/cli.js +11 -1
- package/dist/core/cli.js.map +1 -1
- package/dist/core/cliSurface.d.ts +26 -0
- package/dist/core/cliSurface.js +152 -0
- package/dist/core/cliSurface.js.map +1 -0
- package/dist/core/progressRenderer.d.ts +42 -0
- package/dist/core/progressRenderer.js +176 -0
- package/dist/core/progressRenderer.js.map +1 -0
- package/dist/core/prompt/session.d.ts +45 -0
- package/dist/core/prompt/session.js +48 -0
- package/dist/core/prompt/session.js.map +1 -0
- package/dist/core/repl.d.ts +25 -5
- package/dist/core/repl.js +58 -45
- package/dist/core/repl.js.map +1 -1
- package/dist/core/surfaceDispatch.d.ts +21 -0
- package/dist/core/surfaceDispatch.js +33 -0
- package/dist/core/surfaceDispatch.js.map +1 -0
- package/dist/core/warnings.d.ts +14 -0
- package/dist/core/warnings.js +25 -0
- package/dist/core/warnings.js.map +1 -0
- package/dist/index.js +2 -12
- package/dist/index.js.map +1 -1
- package/dist/remote/client.d.ts +6 -0
- package/dist/remote/client.js +71 -0
- package/dist/remote/client.js.map +1 -0
- package/dist/remote/remoteEngine.d.ts +125 -0
- package/dist/remote/remoteEngine.js +286 -0
- package/dist/remote/remoteEngine.js.map +1 -0
- package/package.json +5 -3
- package/dist/builtins/debug.d.ts +0 -6
- package/dist/builtins/debug.js +0 -47
- package/dist/builtins/debug.js.map +0 -1
- package/dist/builtins/executable.d.ts +0 -22
- package/dist/builtins/executable.js +0 -115
- package/dist/builtins/executable.js.map +0 -1
- package/dist/builtins/fs/cat.d.ts +0 -16
- package/dist/builtins/fs/cat.js +0 -249
- package/dist/builtins/fs/cat.js.map +0 -1
- package/dist/builtins/fs/cd.d.ts +0 -41
- package/dist/builtins/fs/cd.js +0 -178
- package/dist/builtins/fs/cd.js.map +0 -1
- package/dist/builtins/fs/cp.d.ts +0 -7
- package/dist/builtins/fs/cp.js +0 -73
- package/dist/builtins/fs/cp.js.map +0 -1
- package/dist/builtins/fs/download.d.ts +0 -6
- package/dist/builtins/fs/download.js +0 -41
- package/dist/builtins/fs/download.js.map +0 -1
- package/dist/builtins/fs/du.d.ts +0 -58
- package/dist/builtins/fs/du.js +0 -210
- package/dist/builtins/fs/du.js.map +0 -1
- package/dist/builtins/fs/edit.d.ts +0 -7
- package/dist/builtins/fs/edit.js +0 -86
- package/dist/builtins/fs/edit.js.map +0 -1
- package/dist/builtins/fs/ls.d.ts +0 -8
- package/dist/builtins/fs/ls.js +0 -68
- package/dist/builtins/fs/ls.js.map +0 -1
- package/dist/builtins/fs/mkdir.d.ts +0 -6
- package/dist/builtins/fs/mkdir.js +0 -38
- package/dist/builtins/fs/mkdir.js.map +0 -1
- package/dist/builtins/fs/mv.d.ts +0 -7
- package/dist/builtins/fs/mv.js +0 -75
- package/dist/builtins/fs/mv.js.map +0 -1
- package/dist/builtins/fs/pull.args.d.ts +0 -22
- package/dist/builtins/fs/pull.args.js +0 -30
- package/dist/builtins/fs/pull.args.js.map +0 -1
- package/dist/builtins/fs/pull.d.ts +0 -26
- package/dist/builtins/fs/pull.js +0 -417
- package/dist/builtins/fs/pull.js.map +0 -1
- package/dist/builtins/fs/pwd.d.ts +0 -7
- package/dist/builtins/fs/pwd.js +0 -75
- package/dist/builtins/fs/pwd.js.map +0 -1
- package/dist/builtins/fs/rm.d.ts +0 -31
- package/dist/builtins/fs/rm.js +0 -148
- package/dist/builtins/fs/rm.js.map +0 -1
- package/dist/builtins/fs/touch.d.ts +0 -6
- package/dist/builtins/fs/touch.js +0 -64
- package/dist/builtins/fs/touch.js.map +0 -1
- package/dist/builtins/fs/tree.d.ts +0 -15
- package/dist/builtins/fs/tree.js +0 -84
- package/dist/builtins/fs/tree.js.map +0 -1
- package/dist/builtins/fs/upload.d.ts +0 -6
- package/dist/builtins/fs/upload.js +0 -45
- package/dist/builtins/fs/upload.js.map +0 -1
- package/dist/builtins/help.d.ts +0 -74
- package/dist/builtins/help.js +0 -1217
- package/dist/builtins/help.js.map +0 -1
- package/dist/builtins/index.d.ts +0 -45
- package/dist/builtins/index.js +0 -45
- package/dist/builtins/index.js.map +0 -1
- package/dist/builtins/net/connect.d.ts +0 -7
- package/dist/builtins/net/connect.js +0 -42
- package/dist/builtins/net/connect.js.map +0 -1
- package/dist/builtins/net/cubepath.d.ts +0 -18
- package/dist/builtins/net/cubepath.js +0 -102
- package/dist/builtins/net/cubepath.js.map +0 -1
- package/dist/builtins/net/logout.d.ts +0 -6
- package/dist/builtins/net/logout.js +0 -24
- package/dist/builtins/net/logout.js.map +0 -1
- package/dist/builtins/net/pacs.d.ts +0 -24
- package/dist/builtins/net/pacs.js +0 -121
- package/dist/builtins/net/pacs.js.map +0 -1
- package/dist/builtins/net/pacsUtils.d.ts +0 -85
- package/dist/builtins/net/pacsUtils.js +0 -184
- package/dist/builtins/net/pacsUtils.js.map +0 -1
- package/dist/builtins/net/query.d.ts +0 -60
- package/dist/builtins/net/query.js +0 -324
- package/dist/builtins/net/query.js.map +0 -1
- package/dist/builtins/parametersofplugin.d.ts +0 -13
- package/dist/builtins/parametersofplugin.js +0 -43
- package/dist/builtins/parametersofplugin.js.map +0 -1
- package/dist/builtins/pluginExecute.d.ts +0 -27
- package/dist/builtins/pluginExecute.js +0 -165
- package/dist/builtins/pluginExecute.js.map +0 -1
- package/dist/builtins/proc.d.ts +0 -6
- package/dist/builtins/proc.helpers.d.ts +0 -68
- package/dist/builtins/proc.helpers.js +0 -102
- package/dist/builtins/proc.helpers.js.map +0 -1
- package/dist/builtins/proc.js +0 -289
- package/dist/builtins/proc.js.map +0 -1
- package/dist/builtins/res/compute.d.ts +0 -6
- package/dist/builtins/res/compute.js +0 -55
- package/dist/builtins/res/compute.js.map +0 -1
- package/dist/builtins/res/feed.d.ts +0 -6
- package/dist/builtins/res/feed.js +0 -244
- package/dist/builtins/res/feed.js.map +0 -1
- package/dist/builtins/res/feed.notes.d.ts +0 -28
- package/dist/builtins/res/feed.notes.js +0 -24
- package/dist/builtins/res/feed.notes.js.map +0 -1
- package/dist/builtins/res/files.d.ts +0 -18
- package/dist/builtins/res/files.js +0 -85
- package/dist/builtins/res/files.js.map +0 -1
- package/dist/builtins/res/group.d.ts +0 -6
- package/dist/builtins/res/group.js +0 -54
- package/dist/builtins/res/group.js.map +0 -1
- package/dist/builtins/res/pipeline.args.d.ts +0 -22
- package/dist/builtins/res/pipeline.args.js +0 -28
- package/dist/builtins/res/pipeline.args.js.map +0 -1
- package/dist/builtins/res/pipeline.d.ts +0 -20
- package/dist/builtins/res/pipeline.js +0 -252
- package/dist/builtins/res/pipeline.js.map +0 -1
- package/dist/builtins/res/plugin.d.ts +0 -13
- package/dist/builtins/res/plugin.js +0 -140
- package/dist/builtins/res/plugin.js.map +0 -1
- package/dist/builtins/res/plugininstance.d.ts +0 -6
- package/dist/builtins/res/plugininstance.js +0 -53
- package/dist/builtins/res/plugininstance.js.map +0 -1
- package/dist/builtins/res/pluginmeta.d.ts +0 -6
- package/dist/builtins/res/pluginmeta.js +0 -53
- package/dist/builtins/res/pluginmeta.js.map +0 -1
- package/dist/builtins/res/tag.d.ts +0 -6
- package/dist/builtins/res/tag.js +0 -53
- package/dist/builtins/res/tag.js.map +0 -1
- package/dist/builtins/res/workflow.d.ts +0 -6
- package/dist/builtins/res/workflow.js +0 -53
- package/dist/builtins/res/workflow.js.map +0 -1
- package/dist/builtins/store.d.ts +0 -6
- package/dist/builtins/store.js +0 -108
- package/dist/builtins/store.js.map +0 -1
- package/dist/builtins/sys/context.d.ts +0 -6
- package/dist/builtins/sys/context.js +0 -50
- package/dist/builtins/sys/context.js.map +0 -1
- package/dist/builtins/sys/physicalmode.d.ts +0 -6
- package/dist/builtins/sys/physicalmode.js +0 -41
- package/dist/builtins/sys/physicalmode.js.map +0 -1
- package/dist/builtins/sys/timing.d.ts +0 -6
- package/dist/builtins/sys/timing.js +0 -41
- package/dist/builtins/sys/timing.js.map +0 -1
- package/dist/builtins/sys/whoami.d.ts +0 -12
- package/dist/builtins/sys/whoami.js +0 -37
- package/dist/builtins/sys/whoami.js.map +0 -1
- package/dist/builtins/utils.d.ts +0 -55
- package/dist/builtins/utils.js +0 -145
- package/dist/builtins/utils.js.map +0 -1
- package/dist/builtins/wildcard.d.ts +0 -26
- package/dist/builtins/wildcard.js +0 -120
- package/dist/builtins/wildcard.js.map +0 -1
- package/dist/command-keys.d.ts +0 -8
- package/dist/command-keys.js +0 -32
- package/dist/command-keys.js.map +0 -1
- package/dist/core/dispatch.d.ts +0 -48
- package/dist/core/dispatch.js +0 -544
- package/dist/core/dispatch.js.map +0 -1
- package/dist/core/preprocess.d.ts +0 -46
- package/dist/core/preprocess.js +0 -146
- package/dist/core/preprocess.js.map +0 -1
- package/dist/core/question.d.ts +0 -34
- package/dist/core/question.js +0 -76
- package/dist/core/question.js.map +0 -1
- package/dist/lib/completer/index.d.ts +0 -15
- package/dist/lib/completer/index.js +0 -212
- package/dist/lib/completer/index.js.map +0 -1
- package/dist/lib/completer/pathComplete.helpers.d.ts +0 -22
- package/dist/lib/completer/pathComplete.helpers.js +0 -49
- package/dist/lib/completer/pathComplete.helpers.js.map +0 -1
- package/dist/lib/parser.d.ts +0 -13
- package/dist/lib/parser.js +0 -52
- package/dist/lib/parser.js.map +0 -1
- package/dist/lib/pipe.d.ts +0 -11
- package/dist/lib/pipe.js +0 -90
- package/dist/lib/pipe.js.map +0 -1
- package/dist/lib/prefetch.d.ts +0 -25
- package/dist/lib/prefetch.js +0 -64
- package/dist/lib/prefetch.js.map +0 -1
- package/dist/lib/semicolonParser.d.ts +0 -22
- package/dist/lib/semicolonParser.js +0 -53
- package/dist/lib/semicolonParser.js.map +0 -1
- package/dist/lib/spinner.d.ts +0 -23
- package/dist/lib/spinner.js +0 -70
- package/dist/lib/spinner.js.map +0 -1
- package/dist/lib/vfs/providers/static.d.ts +0 -65
- package/dist/lib/vfs/providers/static.js +0 -164
- package/dist/lib/vfs/providers/static.js.map +0 -1
- package/dist/lib/vfs/providers/static_content.d.ts +0 -27
- package/dist/lib/vfs/providers/static_content.js +0 -180
- package/dist/lib/vfs/providers/static_content.js.map +0 -1
- package/dist/lib/vfs/vfs.d.ts +0 -59
- package/dist/lib/vfs/vfs.js +0 -198
- package/dist/lib/vfs/vfs.js.map +0 -1
- package/dist/session/index.d.ts +0 -76
- package/dist/session/index.js +0 -120
- package/dist/session/index.js.map +0 -1
|
@@ -1,30 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
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:12345678
|
|
24
|
-
* pull --retry 3 /net/pacs/queries/42_AccessionNumber:12345678/Study_1.2.3_US-Hips
|
|
25
|
-
*/
|
|
26
|
-
export declare function builtin_pull(args: string[]): Promise<void>;
|
package/dist/builtins/fs/pull.js
DELETED
|
@@ -1,417 +0,0 @@
|
|
|
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
|
-
// CUBE rejects duplicate query titles per user, which used to make a
|
|
64
|
-
// re-pull of the same series fail; a timestamp keeps titles unique.
|
|
65
|
-
title: `pull_${task.seriesUID}_${Date.now().toString(36)}`,
|
|
66
|
-
query: JSON.stringify({
|
|
67
|
-
SeriesInstanceUID: task.seriesUID,
|
|
68
|
-
StudyInstanceUID: task.studyUID,
|
|
69
|
-
}),
|
|
70
|
-
execute: false,
|
|
71
|
-
};
|
|
72
|
-
const queryResult = await pacsQueries_create(pacsserver, queryData);
|
|
73
|
-
if (!queryResult.ok) {
|
|
74
|
-
task.status = 'error';
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
const syntheticQueryId = queryResult.value.id;
|
|
78
|
-
const retrieveResult = await pacsRetrieve_create(syntheticQueryId);
|
|
79
|
-
if (!retrieveResult.ok) {
|
|
80
|
-
task.status = 'error';
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
task.syntheticQueryId = syntheticQueryId;
|
|
84
|
-
task.retrieveId = retrieveResult.value.id;
|
|
85
|
-
task.startTime = Date.now();
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Constructs a LONK WebSocket URL from a download token response.
|
|
89
|
-
*
|
|
90
|
-
* @param tokenUrl - The download token resource URL.
|
|
91
|
-
* @param token - The actual download token string.
|
|
92
|
-
* @returns WebSocket URL for the LONK endpoint.
|
|
93
|
-
*/
|
|
94
|
-
function lonkWsUrl_build(tokenUrl, token) {
|
|
95
|
-
return tokenUrl
|
|
96
|
-
.replace(/^http(s?):\/\//, (_m, s) => `ws${s}://`)
|
|
97
|
-
.replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/ws/?token=${token}`);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Opens a LONK WebSocket, fires retrieves for the given tasks, and blocks until all
|
|
101
|
-
* tasks reach a terminal state. Mutates each task's status, actualFiles, and lonkConfirmed.
|
|
102
|
-
*
|
|
103
|
-
* @param tasks - Tasks to subscribe, fire, and watch.
|
|
104
|
-
* @param pacsserver - Resolved PACS server identifier.
|
|
105
|
-
* @param client - Authenticated ChRIS API client.
|
|
106
|
-
* @returns Number of tasks that failed to fire their retrieve.
|
|
107
|
-
*/
|
|
108
|
-
async function tasks_pullWatch(tasks, pacsserver, client) {
|
|
109
|
-
const tokenClient = client;
|
|
110
|
-
const downloadToken = await tokenClient.createDownloadToken();
|
|
111
|
-
const tokenStr = String(downloadToken.data.token ?? '');
|
|
112
|
-
const wsUrl = lonkWsUrl_build(downloadToken.url, tokenStr);
|
|
113
|
-
const ws = new WebSocket(wsUrl);
|
|
114
|
-
await new Promise((openResolve, openReject) => {
|
|
115
|
-
ws.once('open', openResolve);
|
|
116
|
-
ws.once('error', (err) => openReject(err));
|
|
117
|
-
});
|
|
118
|
-
for (const t of tasks) {
|
|
119
|
-
ws.send(JSON.stringify({
|
|
120
|
-
SeriesInstanceUID: t.seriesUID,
|
|
121
|
-
pacs_name: t.pacsName,
|
|
122
|
-
action: 'subscribe',
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
await Promise.all(tasks.map((t) => task_fire(t, pacsserver)));
|
|
126
|
-
const fired = tasks.filter((t) => t.status !== 'error');
|
|
127
|
-
const firingErrors = tasks.length - fired.length;
|
|
128
|
-
if (fired.length === 0) {
|
|
129
|
-
ws.close();
|
|
130
|
-
return firingErrors;
|
|
131
|
-
}
|
|
132
|
-
const multiBar = new cliProgress.MultiBar({
|
|
133
|
-
format: ' {label}> [{bar}] {value}/{total}',
|
|
134
|
-
barCompleteChar: '█',
|
|
135
|
-
barIncompleteChar: '░',
|
|
136
|
-
hideCursor: true,
|
|
137
|
-
clearOnComplete: false,
|
|
138
|
-
stopOnComplete: false,
|
|
139
|
-
noTTYOutput: true,
|
|
140
|
-
}, cliProgress.Presets.shades_classic);
|
|
141
|
-
const barMap = new Map();
|
|
142
|
-
for (const t of tasks) {
|
|
143
|
-
const bar = multiBar.create(Math.max(t.expectedFiles, 1), 0, { label: t.label });
|
|
144
|
-
barMap.set(t, bar);
|
|
145
|
-
}
|
|
146
|
-
const taskByUID = new Map(tasks.map((t) => [t.seriesUID, t]));
|
|
147
|
-
await new Promise((resolve) => {
|
|
148
|
-
let resolved = false;
|
|
149
|
-
const done = () => {
|
|
150
|
-
if (resolved)
|
|
151
|
-
return;
|
|
152
|
-
resolved = true;
|
|
153
|
-
clearInterval(checker);
|
|
154
|
-
try {
|
|
155
|
-
ws.close();
|
|
156
|
-
}
|
|
157
|
-
catch { /* ignore */ }
|
|
158
|
-
resolve();
|
|
159
|
-
};
|
|
160
|
-
const checker = setInterval(() => {
|
|
161
|
-
const now = Date.now();
|
|
162
|
-
let allTerminal = true;
|
|
163
|
-
for (const t of fired) {
|
|
164
|
-
if (t.status === 'pulled' || t.status === 'error' || t.status === 'stalled' || t.status === 'timeout') {
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
allTerminal = false;
|
|
168
|
-
const bar = barMap.get(t);
|
|
169
|
-
if (t.startTime > 0 && now - t.startTime > SERIES_TIMEOUT_MS) {
|
|
170
|
-
t.status = 'timeout';
|
|
171
|
-
bar?.update(t.actualFiles, { label: `${t.label} [TIMEOUT]` });
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
if (t.actualFiles > 0 && now - t.lastProgressTime > STALL_TIMEOUT_MS) {
|
|
175
|
-
t.status = 'stalled';
|
|
176
|
-
bar?.update(t.actualFiles, { label: `${t.label} [STALLED]` });
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
if (t.startTime > 0 && t.actualFiles === 0 && now - t.startTime > NO_ACTIVITY_TIMEOUT_MS) {
|
|
180
|
-
t.status = 'pulled';
|
|
181
|
-
t.lonkConfirmed = false;
|
|
182
|
-
bar?.update(Math.max(t.expectedFiles, 1), { label: `${t.label} [NO LONK]` });
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (allTerminal)
|
|
187
|
-
done();
|
|
188
|
-
}, CHECKER_INTERVAL_MS);
|
|
189
|
-
ws.on('message', (data) => {
|
|
190
|
-
try {
|
|
191
|
-
const outer = JSON.parse(data.toString());
|
|
192
|
-
const seriesUID = outer.SeriesInstanceUID;
|
|
193
|
-
const message = outer.message;
|
|
194
|
-
if (!seriesUID || !message)
|
|
195
|
-
return;
|
|
196
|
-
const t = taskByUID.get(seriesUID);
|
|
197
|
-
if (!t)
|
|
198
|
-
return;
|
|
199
|
-
const bar = barMap.get(t);
|
|
200
|
-
if ('ndicom' in message && typeof message.ndicom === 'number') {
|
|
201
|
-
const n = message.ndicom;
|
|
202
|
-
t.actualFiles = n;
|
|
203
|
-
t.lastProgressFiles = n;
|
|
204
|
-
t.lastProgressTime = Date.now();
|
|
205
|
-
if (t.status === 'pending')
|
|
206
|
-
t.status = 'pulling';
|
|
207
|
-
const total = t.expectedFiles > 0 ? t.expectedFiles : Math.max(n, 1);
|
|
208
|
-
bar?.setTotal(total);
|
|
209
|
-
bar?.update(n);
|
|
210
|
-
}
|
|
211
|
-
else if ('done' in message && message.done === true) {
|
|
212
|
-
t.status = 'pulled';
|
|
213
|
-
t.lonkConfirmed = true;
|
|
214
|
-
const finalTotal = t.expectedFiles > 0 ? t.expectedFiles : t.actualFiles || 1;
|
|
215
|
-
bar?.setTotal(finalTotal);
|
|
216
|
-
bar?.update(finalTotal, { label: `${t.label} [DONE]` });
|
|
217
|
-
}
|
|
218
|
-
else if ('error' in message && typeof message.error === 'string') {
|
|
219
|
-
t.status = 'error';
|
|
220
|
-
bar?.update(t.actualFiles, { label: `${t.label} [ERROR]` });
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Malformed message — ignore
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
ws.on('error', () => {
|
|
228
|
-
for (const t of fired) {
|
|
229
|
-
if (t.status === 'pending' || t.status === 'pulling') {
|
|
230
|
-
t.status = 'error';
|
|
231
|
-
barMap.get(t)?.update(t.actualFiles, { label: `${t.label} [WS ERROR]` });
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
done();
|
|
235
|
-
});
|
|
236
|
-
ws.on('close', () => { done(); });
|
|
237
|
-
});
|
|
238
|
-
multiBar.stop();
|
|
239
|
-
return firingErrors;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Resolves raw path/query arguments to concrete `/net/pacs` VFS paths,
|
|
243
|
-
* running PACS queries for query expressions.
|
|
244
|
-
*
|
|
245
|
-
* @param paths - Raw path or query-expression operands.
|
|
246
|
-
* @param pacsserver - The resolved PACS server identifier.
|
|
247
|
-
* @returns The resolved VFS paths.
|
|
248
|
-
*/
|
|
249
|
-
async function paths_resolveToVfs(paths, pacsserver) {
|
|
250
|
-
const resolvedPaths = [];
|
|
251
|
-
for (const rawPath of paths) {
|
|
252
|
-
const p = rawPath.startsWith('/') ? rawPath : await path_resolve(rawPath);
|
|
253
|
-
if (p.startsWith('/net/pacs')) {
|
|
254
|
-
resolvedPaths.push(p);
|
|
255
|
-
}
|
|
256
|
-
else if (queryExpr_parse(rawPath)) {
|
|
257
|
-
// Query with the RAW expression: path resolution prefixes the CWD,
|
|
258
|
-
// which would corrupt the first DICOM key (e.g. '/AccessionNumber').
|
|
259
|
-
spinner.start(`Querying PACS for ${rawPath}...`, true);
|
|
260
|
-
const qResult = await pacsQuery_createAndWait(rawPath, `pull_${rawPath}`, pacsserver, (msg) => spinner.updateMessage(msg));
|
|
261
|
-
spinner.stop();
|
|
262
|
-
if (qResult) {
|
|
263
|
-
console.log(chalk.gray(` → ${qResult.vfsPath}`));
|
|
264
|
-
resolvedPaths.push(qResult.vfsPath);
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
console.error(chalk.red(`pull: Query failed for: ${rawPath}`));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
console.error(chalk.red(`pull: Not a PACS VFS path or valid query expression: ${rawPath}`));
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return resolvedPaths;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Re-fires retrieves for series that pulled without LONK confirmation, up to
|
|
278
|
-
* `retryMax` additional attempts, then permanently fails any still unconfirmed.
|
|
279
|
-
*
|
|
280
|
-
* @param allTasks - All pull tasks.
|
|
281
|
-
* @param retryMax - Maximum retry attempts.
|
|
282
|
-
* @param pacsserver - The PACS server identifier.
|
|
283
|
-
* @param client - The connected ChRIS client.
|
|
284
|
-
* @returns The number of additional retrieve-firing errors incurred.
|
|
285
|
-
*/
|
|
286
|
-
async function pullRetryLoop(allTasks, retryMax, pacsserver, client) {
|
|
287
|
-
let extraFiringErrors = 0;
|
|
288
|
-
let retryCandidates = allTasks.filter((t) => t.status === 'pulled' && !t.lonkConfirmed);
|
|
289
|
-
const pacsClient = client;
|
|
290
|
-
for (let attempt = 1; attempt <= retryMax && retryCandidates.length > 0; attempt++) {
|
|
291
|
-
await Promise.all(retryCandidates.map(async (t) => {
|
|
292
|
-
const result = await series_cubePathGet(t.seriesUID, pacsClient, 1, 0);
|
|
293
|
-
if (result) {
|
|
294
|
-
t.lonkConfirmed = true;
|
|
295
|
-
t.cubePathDir = result.folderPath;
|
|
296
|
-
}
|
|
297
|
-
}));
|
|
298
|
-
retryCandidates = retryCandidates.filter((t) => !t.lonkConfirmed);
|
|
299
|
-
if (retryCandidates.length === 0)
|
|
300
|
-
break;
|
|
301
|
-
console.log(chalk.yellow(`\nRetry ${attempt}/${retryMax} for ${retryCandidates.length} unconfirmed series...`));
|
|
302
|
-
for (const t of retryCandidates) {
|
|
303
|
-
t.status = 'pending';
|
|
304
|
-
t.actualFiles = 0;
|
|
305
|
-
t.lastProgressFiles = 0;
|
|
306
|
-
t.lastProgressTime = Date.now();
|
|
307
|
-
t.startTime = 0;
|
|
308
|
-
t.lonkConfirmed = false;
|
|
309
|
-
t.syntheticQueryId = null;
|
|
310
|
-
t.retrieveId = null;
|
|
311
|
-
}
|
|
312
|
-
extraFiringErrors += await tasks_pullWatch(retryCandidates, pacsserver, client);
|
|
313
|
-
retryCandidates = retryCandidates.filter((t) => t.status === 'pulled' && !t.lonkConfirmed);
|
|
314
|
-
}
|
|
315
|
-
for (const t of retryCandidates) {
|
|
316
|
-
t.status = 'error';
|
|
317
|
-
}
|
|
318
|
-
return extraFiringErrors;
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Prints the pull summary and sets a non-zero exit code on any failure.
|
|
322
|
-
*
|
|
323
|
-
* @param allTasks - All pull tasks.
|
|
324
|
-
* @param totalFiringErrors - Count of retrieve-firing errors across all attempts.
|
|
325
|
-
*/
|
|
326
|
-
function pullSummary_print(allTasks, totalFiringErrors) {
|
|
327
|
-
const pulled = allTasks.filter((t) => t.status === 'pulled').length;
|
|
328
|
-
const totalCount = allTasks.length;
|
|
329
|
-
const failures = allTasks.filter((t) => t.status !== 'pulled');
|
|
330
|
-
if (failures.length === 0) {
|
|
331
|
-
console.log(chalk.green(`\n✓ ${pulled}/${totalCount} series pulled successfully.`));
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
console.log(chalk.yellow(`\n⚠ ${pulled}/${totalCount} series complete.`));
|
|
335
|
-
for (const f of failures) {
|
|
336
|
-
console.log(chalk.red(` ✗ ${f.label} [${f.status.toUpperCase()}]`));
|
|
337
|
-
}
|
|
338
|
-
process.exitCode = 1;
|
|
339
|
-
}
|
|
340
|
-
if (totalFiringErrors > 0) {
|
|
341
|
-
console.log(chalk.red(` ${totalFiringErrors} retrieve(s) failed to start.`));
|
|
342
|
-
process.exitCode = 1;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Pulls one or more `/net/pacs/queries/...` VFS paths into ChRIS storage.
|
|
347
|
-
*
|
|
348
|
-
* Blocking by default: shows per-series MultiBar progress via LONK WebSocket,
|
|
349
|
-
* exits non-zero on partial failure.
|
|
350
|
-
* With `--nowait`: fires retrieves and prints `<seriesUID> <retrieveId>` per line, then returns.
|
|
351
|
-
* With `--retry N`: re-fires retrieves for [NO LONK] series up to N additional times.
|
|
352
|
-
*
|
|
353
|
-
* @param args - Command arguments (VFS paths, optional flags).
|
|
354
|
-
* @example
|
|
355
|
-
* pull /net/pacs/queries/42_AccessionNumber:12345678
|
|
356
|
-
* pull --retry 3 /net/pacs/queries/42_AccessionNumber:12345678/Study_1.2.3_US-Hips
|
|
357
|
-
*/
|
|
358
|
-
export async function builtin_pull(args) {
|
|
359
|
-
if (args_checkHasHelpFlag(args, 'pull')) {
|
|
360
|
-
help_show('pull');
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
const { nowait, retryMax, paths } = pullArgs_parse(args);
|
|
364
|
-
if (paths.length === 0) {
|
|
365
|
-
console.error(chalk.red('pull: No paths specified. Usage: pull [--nowait] [--retry N] <vfs-path> [...]'));
|
|
366
|
-
process.exitCode = 1;
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const pacsIdentifier = await pacsServer_resolve();
|
|
370
|
-
if (!pacsIdentifier) {
|
|
371
|
-
console.error(chalk.red('pull: No PACS server available. Set one with: pacs connect <id>'));
|
|
372
|
-
process.exitCode = 1;
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
const pacsserver = pacsIdentifier;
|
|
376
|
-
const resolvedPaths = await paths_resolveToVfs(paths, pacsserver);
|
|
377
|
-
const allTasks = [];
|
|
378
|
-
for (const p of resolvedPaths) {
|
|
379
|
-
const tasks = await path_seriesCollect(p, pacsIdentifier);
|
|
380
|
-
if (tasks.length === 0) {
|
|
381
|
-
console.error(chalk.yellow(`pull: No series found under: ${p}`));
|
|
382
|
-
}
|
|
383
|
-
allTasks.push(...tasks);
|
|
384
|
-
}
|
|
385
|
-
if (allTasks.length === 0) {
|
|
386
|
-
console.error(chalk.red('pull: No series to retrieve.'));
|
|
387
|
-
process.exitCode = 1;
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
const client = await session.connection.client_get();
|
|
391
|
-
if (!client) {
|
|
392
|
-
console.error(chalk.red('pull: Not connected to ChRIS.'));
|
|
393
|
-
process.exitCode = 1;
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
// --nowait: fire retrieves and exit without watching
|
|
397
|
-
if (nowait) {
|
|
398
|
-
for (const t of allTasks) {
|
|
399
|
-
await task_fire(t, pacsserver);
|
|
400
|
-
if (t.retrieveId !== null) {
|
|
401
|
-
console.log(`${t.seriesUID} ${t.retrieveId}`);
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
console.log(`${t.seriesUID} ERROR`);
|
|
405
|
-
process.exitCode = 1;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
let totalFiringErrors = await tasks_pullWatch(allTasks, pacsserver, client);
|
|
411
|
-
totalFiringErrors += await pullRetryLoop(allTasks, retryMax, pacsserver, client);
|
|
412
|
-
pullSummary_print(allTasks, totalFiringErrors);
|
|
413
|
-
// Report CUBE paths via cubepath; --retry handles pacsseries DB lag post-pull
|
|
414
|
-
await builtin_cubepath([...resolvedPaths, '--retry']);
|
|
415
|
-
console.log(chalk.gray('Detached — use `pacsretrieve report <queryId>` to verify.'));
|
|
416
|
-
}
|
|
417
|
-
//# sourceMappingURL=pull.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/builtins/fs/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
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>;
|
package/dist/builtins/fs/pwd.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pwd.js","sourceRoot":"","sources":["../../../src/builtins/fs/pwd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAiB,EAAE;IACnD,MAAM,UAAU,GAAY,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,GAAG,GAAW,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IAE3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAW,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,MAAM,KAAK,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAa,MAAM,OAAO,CAAC,GAAG,CAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAY,EAAmB,EAAE;QAChD,uBAAuB;QACvB,MAAM,SAAS,GAA4B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACtE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAW,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAgC,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzF,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpE,MAAM,IAAI,GAA4B,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC5D,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC1C,OAAO,IAAI,CAAC,IAAI,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,yBAAyB;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAA4B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3E,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,gBAAgB,GAAW,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAgC,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjH,IAAI,YAAY,IAAI,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChF,MAAM,QAAQ,GAA4B,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACpE,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,UAAU,GAAW,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChG,MAAM,aAAa,GAAW,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzG,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;oBACxE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,yBAAyB;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,+BAA+B;IAC9C,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/builtins/fs/rm.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
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>;
|