@fnndsc/brasa 0.9.2 → 0.10.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/buildinfo.json +1 -0
- package/dist/builtins/argumentTokens.d.ts +18 -0
- package/dist/builtins/argumentTokens.js +58 -0
- package/dist/builtins/argumentTokens.js.map +1 -0
- package/dist/builtins/executable.d.ts +3 -7
- package/dist/builtins/executable.js +32 -29
- package/dist/builtins/executable.js.map +1 -1
- package/dist/builtins/feedCreation.d.ts +23 -0
- package/dist/builtins/feedCreation.js +45 -0
- package/dist/builtins/feedCreation.js.map +1 -0
- package/dist/builtins/fs/cat.args.d.ts +36 -0
- package/dist/builtins/fs/cat.args.js +63 -0
- package/dist/builtins/fs/cat.args.js.map +1 -0
- package/dist/builtins/fs/cat.d.ts +2 -2
- package/dist/builtins/fs/cat.js +222 -101
- package/dist/builtins/fs/cat.js.map +1 -1
- package/dist/builtins/fs/cd.js +41 -5
- package/dist/builtins/fs/cd.js.map +1 -1
- package/dist/builtins/fs/cp.js +3 -2
- package/dist/builtins/fs/cp.js.map +1 -1
- package/dist/builtins/fs/download.d.ts +1 -1
- package/dist/builtins/fs/download.js +52 -13
- package/dist/builtins/fs/download.js.map +1 -1
- package/dist/builtins/fs/du.js +15 -1
- package/dist/builtins/fs/du.js.map +1 -1
- package/dist/builtins/fs/ls.js +10 -1
- package/dist/builtins/fs/ls.js.map +1 -1
- package/dist/builtins/fs/mv.js +7 -3
- package/dist/builtins/fs/mv.js.map +1 -1
- package/dist/builtins/fs/pull.args.d.ts +14 -1
- package/dist/builtins/fs/pull.args.js +72 -9
- package/dist/builtins/fs/pull.args.js.map +1 -1
- package/dist/builtins/fs/pull.d.ts +1 -0
- package/dist/builtins/fs/pull.js +191 -259
- package/dist/builtins/fs/pull.js.map +1 -1
- package/dist/builtins/fs/rm.js +4 -0
- package/dist/builtins/fs/rm.js.map +1 -1
- package/dist/builtins/fs/tree.js +7 -3
- package/dist/builtins/fs/tree.js.map +1 -1
- package/dist/builtins/fs/upload.js +29 -2
- package/dist/builtins/fs/upload.js.map +1 -1
- package/dist/builtins/help.d.ts +7 -0
- package/dist/builtins/help.js +144 -36
- package/dist/builtins/help.js.map +1 -1
- package/dist/builtins/index.d.ts +1 -0
- package/dist/builtins/index.js +1 -0
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/net/pacs.d.ts +1 -0
- package/dist/builtins/net/pacs.js +5 -1
- package/dist/builtins/net/pacs.js.map +1 -1
- package/dist/builtins/net/pacsUtils.d.ts +5 -4
- package/dist/builtins/net/pacsUtils.js +12 -32
- package/dist/builtins/net/pacsUtils.js.map +1 -1
- package/dist/builtins/net/query.js +4 -1
- package/dist/builtins/net/query.js.map +1 -1
- package/dist/builtins/net/status.d.ts +14 -0
- package/dist/builtins/net/status.js +210 -0
- package/dist/builtins/net/status.js.map +1 -0
- package/dist/builtins/pluginExecute.d.ts +3 -2
- package/dist/builtins/pluginExecute.js +41 -70
- package/dist/builtins/pluginExecute.js.map +1 -1
- package/dist/builtins/pluginSelector.d.ts +15 -0
- package/dist/builtins/pluginSelector.js +21 -0
- package/dist/builtins/pluginSelector.js.map +1 -0
- package/dist/builtins/proc.js +106 -4
- package/dist/builtins/proc.js.map +1 -1
- package/dist/builtins/res/compute.js +8 -3
- package/dist/builtins/res/compute.js.map +1 -1
- package/dist/builtins/res/group.d.ts +1 -1
- package/dist/builtins/res/group.js +122 -5
- package/dist/builtins/res/group.js.map +1 -1
- package/dist/builtins/res/pipeline.args.d.ts +4 -0
- package/dist/builtins/res/pipeline.args.js +63 -12
- package/dist/builtins/res/pipeline.args.js.map +1 -1
- package/dist/builtins/res/pipeline.d.ts +3 -1
- package/dist/builtins/res/pipeline.js +155 -60
- package/dist/builtins/res/pipeline.js.map +1 -1
- package/dist/builtins/res/pipeline.manifest.d.ts +15 -0
- package/dist/builtins/res/pipeline.manifest.js +93 -0
- package/dist/builtins/res/pipeline.manifest.js.map +1 -0
- package/dist/builtins/res/plugin.js +14 -7
- package/dist/builtins/res/plugin.js.map +1 -1
- package/dist/builtins/res/user.d.ts +8 -0
- package/dist/builtins/res/user.js +87 -0
- package/dist/builtins/res/user.js.map +1 -0
- package/dist/builtins/store.js +24 -3
- package/dist/builtins/store.js.map +1 -1
- package/dist/builtins/sys/fortune.d.ts +9 -0
- package/dist/builtins/sys/fortune.js +16 -1
- package/dist/builtins/sys/fortune.js.map +1 -1
- package/dist/builtins/sys/whoami.d.ts +13 -1
- package/dist/builtins/sys/whoami.js +47 -2
- package/dist/builtins/sys/whoami.js.map +1 -1
- package/dist/builtins/utils.d.ts +14 -1
- package/dist/builtins/utils.js +13 -3
- package/dist/builtins/utils.js.map +1 -1
- package/dist/builtins/wildcard.d.ts +31 -0
- package/dist/builtins/wildcard.js +112 -50
- package/dist/builtins/wildcard.js.map +1 -1
- package/dist/command-keys.js +2 -1
- package/dist/command-keys.js.map +1 -1
- package/dist/core/cancellation.d.ts +28 -0
- package/dist/core/cancellation.js +70 -0
- package/dist/core/cancellation.js.map +1 -0
- package/dist/core/dispatch.d.ts +1 -8
- package/dist/core/dispatch.js +82 -82
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/elevation.d.ts +35 -0
- package/dist/core/elevation.js +77 -0
- package/dist/core/elevation.js.map +1 -0
- package/dist/core/engine.d.ts +12 -0
- package/dist/core/engine.js +35 -8
- package/dist/core/engine.js.map +1 -1
- package/dist/core/preprocess.d.ts +11 -4
- package/dist/core/preprocess.js +43 -10
- package/dist/core/preprocess.js.map +1 -1
- package/dist/core/progress.d.ts +15 -5
- package/dist/core/progress.js +14 -0
- package/dist/core/progress.js.map +1 -1
- package/dist/core/promptContext.d.ts +3 -5
- package/dist/core/promptContext.js +9 -2
- package/dist/core/promptContext.js.map +1 -1
- package/dist/core/sink.d.ts +9 -0
- package/dist/core/sink.js +23 -3
- package/dist/core/sink.js.map +1 -1
- package/dist/core/surface.d.ts +14 -0
- package/dist/core/surface.js +5 -0
- package/dist/core/surface.js.map +1 -1
- package/dist/core/version.d.ts +34 -0
- package/dist/core/version.js +51 -0
- package/dist/core/version.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/completer/index.js +39 -1
- package/dist/lib/completer/index.js.map +1 -1
- package/dist/lib/parser.d.ts +75 -2
- package/dist/lib/parser.js +158 -15
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/vfs/providers/binEntry.d.ts +20 -0
- package/dist/lib/vfs/providers/binEntry.js +47 -0
- package/dist/lib/vfs/providers/binEntry.js.map +1 -0
- package/dist/lib/vfs/providers/static.js +1 -0
- package/dist/lib/vfs/providers/static.js.map +1 -1
- package/dist/lib/vfs/providers/static_content.js +5 -36
- package/dist/lib/vfs/providers/static_content.js.map +1 -1
- package/dist/lib/vfs/vfs.d.ts +7 -0
- package/dist/lib/vfs/vfs.js +25 -0
- package/dist/lib/vfs/vfs.js.map +1 -1
- package/dist/session/index.d.ts +18 -0
- package/dist/session/index.js +29 -1
- package/dist/session/index.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin `pacs status`.
|
|
3
|
+
*
|
|
4
|
+
* Reports, per series, how much of a PACS query's data has actually landed in
|
|
5
|
+
* CUBE storage: a fill bar of registered files against the expected DICOM
|
|
6
|
+
* instance count, the derived state (pending/pulling/pulled), and the in-CUBE
|
|
7
|
+
* `/SERVICES` folder each pulled series occupies. This is the observability
|
|
8
|
+
* half of the pull recovery loop: `pacs status` shows what is missing, and
|
|
9
|
+
* re-running `pull` fetches exactly that.
|
|
10
|
+
*
|
|
11
|
+
* The target may be a query expression (`AccessionNumber:22119730`), a
|
|
12
|
+
* `/net/pacs/queries/...` VFS path, or a bare numeric query id. An expression
|
|
13
|
+
* is matched against the caller's existing PACS queries (most recent wins) so
|
|
14
|
+
* repeated status checks do not mint new query records; only when no match
|
|
15
|
+
* exists is a fresh query created.
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import { pacsQueries_list, pacsRetrieve_statusForQuery, envelope_ok, envelope_error, } from '@fnndsc/cumin';
|
|
21
|
+
import { args_checkHasHelpFlag, help_render } from '../help.js';
|
|
22
|
+
import { spinner } from '../../lib/spinner.js';
|
|
23
|
+
import { pacsQuery_createAndWait, queryExpr_parse } from './query.js';
|
|
24
|
+
import { queryId_extractFromFolder } from '@fnndsc/salsa';
|
|
25
|
+
import { pacsServer_resolve } from './pacsUtils.js';
|
|
26
|
+
/** Width of the per-series fill bar, in characters. */
|
|
27
|
+
const BAR_WIDTH = 20;
|
|
28
|
+
/**
|
|
29
|
+
* Renders a fill bar for a series' progress.
|
|
30
|
+
*
|
|
31
|
+
* @param actual - Files registered in CUBE.
|
|
32
|
+
* @param expected - Files the PACS reports for the series.
|
|
33
|
+
* @returns A `▓▓▓░░░`-style bar of {@link BAR_WIDTH} characters.
|
|
34
|
+
*/
|
|
35
|
+
function bar_render(actual, expected) {
|
|
36
|
+
const denominator = Math.max(expected, actual, 1);
|
|
37
|
+
const filled = Math.min(BAR_WIDTH, Math.round((actual / denominator) * BAR_WIDTH));
|
|
38
|
+
return `${'▓'.repeat(filled)}${'░'.repeat(BAR_WIDTH - filled)}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Colors a series line by its retrieve state.
|
|
42
|
+
*
|
|
43
|
+
* @param status - The series' derived state.
|
|
44
|
+
* @param text - The rendered line.
|
|
45
|
+
* @returns The line, colored: pulled green, pulling yellow, pending gray,
|
|
46
|
+
* error red.
|
|
47
|
+
*/
|
|
48
|
+
function seriesLine_colorize(status, text) {
|
|
49
|
+
if (status === 'pulled')
|
|
50
|
+
return chalk.green(text);
|
|
51
|
+
if (status === 'pulling')
|
|
52
|
+
return chalk.yellow(text);
|
|
53
|
+
if (status === 'error')
|
|
54
|
+
return chalk.red(text);
|
|
55
|
+
return chalk.gray(text);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Finds the caller's most recent PACS query whose stored expression matches
|
|
59
|
+
* the given one.
|
|
60
|
+
*
|
|
61
|
+
* Queries store their expression as canonical JSON of the parsed key/value
|
|
62
|
+
* map, so matching compares parsed objects rather than raw strings.
|
|
63
|
+
*
|
|
64
|
+
* @param exprObj - The parsed query expression.
|
|
65
|
+
* @returns The highest (most recent) matching query id, or null when none
|
|
66
|
+
* matches.
|
|
67
|
+
*/
|
|
68
|
+
async function queryId_findForExpression(exprObj) {
|
|
69
|
+
const listResult = await pacsQueries_list({ limit: 200, offset: 0 });
|
|
70
|
+
if (!listResult.ok || !listResult.value)
|
|
71
|
+
return null;
|
|
72
|
+
const listing = listResult.value;
|
|
73
|
+
const rows = listing.tableData ?? [];
|
|
74
|
+
let bestId = null;
|
|
75
|
+
for (const row of rows) {
|
|
76
|
+
const rawQuery = row.query;
|
|
77
|
+
const id = Number(row.id);
|
|
78
|
+
if (typeof rawQuery !== 'string' || !Number.isInteger(id))
|
|
79
|
+
continue;
|
|
80
|
+
let stored;
|
|
81
|
+
try {
|
|
82
|
+
stored = JSON.parse(rawQuery);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const storedKeys = Object.keys(stored ?? {});
|
|
88
|
+
const exprKeys = Object.keys(exprObj);
|
|
89
|
+
const matches = storedKeys.length === exprKeys.length &&
|
|
90
|
+
exprKeys.every((key) => stored[key] === exprObj[key]);
|
|
91
|
+
if (matches && (bestId === null || id > bestId))
|
|
92
|
+
bestId = id;
|
|
93
|
+
}
|
|
94
|
+
return bestId;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolves a status target to a numeric query id.
|
|
98
|
+
*
|
|
99
|
+
* @param target - A bare query id, a `/net/pacs/queries/...` path, or a query
|
|
100
|
+
* expression.
|
|
101
|
+
* @param pacsserver - The resolved PACS server identifier, used only when a
|
|
102
|
+
* fresh query must be created for an unmatched expression.
|
|
103
|
+
* @returns The query id, or null when the target cannot be resolved (an error
|
|
104
|
+
* line has been rendered by the caller from the returned reason).
|
|
105
|
+
*/
|
|
106
|
+
async function statusTarget_resolve(target, pacsserver) {
|
|
107
|
+
if (/^\d+$/.test(target)) {
|
|
108
|
+
return { queryId: Number(target), reason: '' };
|
|
109
|
+
}
|
|
110
|
+
if (target.startsWith('/')) {
|
|
111
|
+
const parsedId = queryId_extractFromFolder(target);
|
|
112
|
+
if (!Number.isNaN(parsedId))
|
|
113
|
+
return { queryId: parsedId, reason: '' };
|
|
114
|
+
return { queryId: null, reason: `Cannot parse a query id from path: ${target}` };
|
|
115
|
+
}
|
|
116
|
+
const exprObj = queryExpr_parse(target);
|
|
117
|
+
if (!exprObj) {
|
|
118
|
+
return { queryId: null, reason: `Not a query id, PACS path, or query expression: ${target}` };
|
|
119
|
+
}
|
|
120
|
+
const existing = await queryId_findForExpression(exprObj);
|
|
121
|
+
if (existing !== null)
|
|
122
|
+
return { queryId: existing, reason: '' };
|
|
123
|
+
// No prior query for this expression: run one so status has a series list
|
|
124
|
+
// to compare against.
|
|
125
|
+
spinner.start(`Querying PACS for ${target}...`, true);
|
|
126
|
+
const created = await pacsQuery_createAndWait(target, `status_${target}`, pacsserver, (msg) => spinner.updateMessage(msg));
|
|
127
|
+
spinner.stop();
|
|
128
|
+
if (!created)
|
|
129
|
+
return { queryId: null, reason: `Query failed for: ${target}` };
|
|
130
|
+
return { queryId: created.queryId, reason: '' };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Renders a status report: per study, one bar line per series with counts,
|
|
134
|
+
* state, and the in-CUBE folder path.
|
|
135
|
+
*
|
|
136
|
+
* @param report - The status report to render.
|
|
137
|
+
* @returns The rendered multi-line report.
|
|
138
|
+
*/
|
|
139
|
+
function statusReport_render(report) {
|
|
140
|
+
const lines = [];
|
|
141
|
+
let pulledCount = 0;
|
|
142
|
+
let seriesCount = 0;
|
|
143
|
+
for (const study of report.studies) {
|
|
144
|
+
lines.push(chalk.bold(`Study: ${study.studyDescription ?? study.studyInstanceUID ?? 'unknown'}`));
|
|
145
|
+
const descWidth = Math.max(...study.series.map((s) => (s.seriesDescription ?? s.seriesInstanceUID).length), 1);
|
|
146
|
+
for (const series of study.series) {
|
|
147
|
+
seriesCount++;
|
|
148
|
+
if (series.status === 'pulled')
|
|
149
|
+
pulledCount++;
|
|
150
|
+
const desc = (series.seriesDescription ?? series.seriesInstanceUID).padEnd(descWidth);
|
|
151
|
+
const bar = bar_render(series.actualFiles, series.expectedFiles);
|
|
152
|
+
const counts = `${series.actualFiles}/${series.expectedFiles}`.padStart(9);
|
|
153
|
+
const state = series.status.padEnd(7);
|
|
154
|
+
lines.push(seriesLine_colorize(series.status, ` ${desc} ${bar} ${counts} ${state}`));
|
|
155
|
+
if (series.folderPath !== null) {
|
|
156
|
+
lines.push(chalk.gray(` ${' '.repeat(descWidth)} ${series.folderPath}`));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
lines.push('');
|
|
160
|
+
}
|
|
161
|
+
const summaryColor = pulledCount === seriesCount ? chalk.green : chalk.yellow;
|
|
162
|
+
lines.push(summaryColor(`${pulledCount}/${seriesCount} series fully in CUBE.`));
|
|
163
|
+
if (pulledCount < seriesCount) {
|
|
164
|
+
lines.push(chalk.gray(`Re-run pull to fetch the missing series; already-complete series are skipped.`));
|
|
165
|
+
}
|
|
166
|
+
return `${lines.join('\n')}\n`;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Reports per-series pull status for a PACS query: expected vs registered
|
|
170
|
+
* file counts, derived state, and the in-CUBE storage path.
|
|
171
|
+
*
|
|
172
|
+
* @param args - `[target]` where target is a query expression, a
|
|
173
|
+
* `/net/pacs/queries/...` path, or a numeric query id.
|
|
174
|
+
* @returns An envelope carrying the rendered report and a typed model of it.
|
|
175
|
+
* @example
|
|
176
|
+
* pacs status AccessionNumber:22119730
|
|
177
|
+
* pacs status /net/pacs/queries/AccessionNumber:22119730_qid:2833
|
|
178
|
+
* pacs status 2833
|
|
179
|
+
*/
|
|
180
|
+
export async function builtin_pacsStatus(args) {
|
|
181
|
+
if (args_checkHasHelpFlag(args, 'pacs')) {
|
|
182
|
+
return envelope_ok(help_render('pacs'));
|
|
183
|
+
}
|
|
184
|
+
const target = args.find((a) => !a.startsWith('--'));
|
|
185
|
+
if (!target) {
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
return envelope_error('', undefined, `${chalk.red('pacs status: Missing target. Usage: pacs status <expression | path | queryId>')}\n`);
|
|
188
|
+
}
|
|
189
|
+
const pacsserver = await pacsServer_resolve(null);
|
|
190
|
+
if (!pacsserver) {
|
|
191
|
+
process.exitCode = 1;
|
|
192
|
+
return envelope_error('', undefined, `${chalk.red('pacs status: No PACS server available. Set one with: pacs connect <id>')}\n`);
|
|
193
|
+
}
|
|
194
|
+
const { queryId, reason } = await statusTarget_resolve(target, pacsserver);
|
|
195
|
+
if (queryId === null) {
|
|
196
|
+
process.exitCode = 1;
|
|
197
|
+
return envelope_error('', undefined, `${chalk.red(`pacs status: ${reason}`)}\n`);
|
|
198
|
+
}
|
|
199
|
+
spinner.start(`Resolving CUBE storage for query ${queryId}...`, true);
|
|
200
|
+
const reportResult = await pacsRetrieve_statusForQuery(queryId);
|
|
201
|
+
spinner.stop();
|
|
202
|
+
if (!reportResult.ok) {
|
|
203
|
+
process.exitCode = 1;
|
|
204
|
+
return envelope_error('', undefined, `${chalk.red(`pacs status: Failed to build status report for query ${queryId}.`)}\n`);
|
|
205
|
+
}
|
|
206
|
+
const report = reportResult.value;
|
|
207
|
+
const rendered = `${chalk.bold(`Query ${queryId}`)}\n${statusReport_render(report)}`;
|
|
208
|
+
return envelope_ok(rendered, { kind: 'pacs.status', data: report });
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/builtins/net/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
+
import { type CommandEnvelope } from '@fnndsc/cumin';
|
|
9
10
|
/**
|
|
10
11
|
* Executes a plugin in the current directory context.
|
|
11
12
|
*
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
*
|
|
15
16
|
* @param pluginName - Full plugin name with version (e.g., pl-dcm2niix-v2.1.1).
|
|
16
17
|
* @param args - Array of command line arguments.
|
|
17
|
-
* @returns
|
|
18
|
+
* @returns Command envelope whose status matches parsing and execution.
|
|
18
19
|
*
|
|
19
20
|
* @example
|
|
20
21
|
* ```typescript
|
|
@@ -24,4 +25,4 @@
|
|
|
24
25
|
* ]);
|
|
25
26
|
* ```
|
|
26
27
|
*/
|
|
27
|
-
export declare function builtin_executePlugin(pluginName: string, args: string[]): Promise<
|
|
28
|
+
export declare function builtin_executePlugin(pluginName: string, args: string[]): Promise<CommandEnvelope>;
|
|
@@ -7,33 +7,14 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import { plugin_executeInPlace } from '@fnndsc/salsa';
|
|
10
|
-
import {
|
|
10
|
+
import { errorStack, procCache_get, envelope_error, envelope_ok, } from '@fnndsc/cumin';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
12
|
import { session } from '../session/index.js';
|
|
13
13
|
import { vfs } from '../lib/vfs/vfs.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
}
|
|
14
|
+
import { newFeed_cacheAdd } from './feedCreation.js';
|
|
15
|
+
import { executableArguments_parse } from './argumentTokens.js';
|
|
16
|
+
import { pluginSelector_normalize } from './pluginSelector.js';
|
|
17
|
+
import { sink_dataLine, sink_errLine } from '../core/sink.js';
|
|
37
18
|
/**
|
|
38
19
|
* Executes a plugin in the current directory context.
|
|
39
20
|
*
|
|
@@ -42,7 +23,7 @@ function pluginName_toSearchString(pluginName) {
|
|
|
42
23
|
*
|
|
43
24
|
* @param pluginName - Full plugin name with version (e.g., pl-dcm2niix-v2.1.1).
|
|
44
25
|
* @param args - Array of command line arguments.
|
|
45
|
-
* @returns
|
|
26
|
+
* @returns Command envelope whose status matches parsing and execution.
|
|
46
27
|
*
|
|
47
28
|
* @example
|
|
48
29
|
* ```typescript
|
|
@@ -54,88 +35,76 @@ function pluginName_toSearchString(pluginName) {
|
|
|
54
35
|
*/
|
|
55
36
|
export async function builtin_executePlugin(pluginName, args) {
|
|
56
37
|
try {
|
|
57
|
-
// 1.
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
}
|
|
38
|
+
// 1. Split the already-tokenized arguments on the context delimiter.
|
|
39
|
+
const delimiterIndex = args.indexOf('--');
|
|
40
|
+
const pluginArgTokens = delimiterIndex === -1 ? args : args.slice(0, delimiterIndex);
|
|
41
|
+
const contextArgTokens = delimiterIndex === -1 ? [] : args.slice(delimiterIndex + 1);
|
|
67
42
|
// 2. Parse both sets of parameters
|
|
68
43
|
let pluginParams = {};
|
|
69
44
|
let contextParams = {};
|
|
70
|
-
if (
|
|
45
|
+
if (pluginArgTokens.length > 0) {
|
|
71
46
|
try {
|
|
72
|
-
pluginParams =
|
|
47
|
+
pluginParams = executableArguments_parse(pluginArgTokens);
|
|
73
48
|
}
|
|
74
49
|
catch (e) {
|
|
75
50
|
const msg = e instanceof Error ? e.message : String(e);
|
|
76
|
-
|
|
77
|
-
return;
|
|
51
|
+
sink_errLine(chalk.red(`Error parsing plugin parameters: ${msg}`));
|
|
52
|
+
return envelope_error('');
|
|
78
53
|
}
|
|
79
54
|
}
|
|
80
|
-
if (
|
|
55
|
+
if (contextArgTokens.length > 0) {
|
|
81
56
|
try {
|
|
82
|
-
contextParams =
|
|
57
|
+
contextParams = executableArguments_parse(contextArgTokens);
|
|
83
58
|
}
|
|
84
59
|
catch (e) {
|
|
85
60
|
const msg = e instanceof Error ? e.message : String(e);
|
|
86
|
-
|
|
87
|
-
return;
|
|
61
|
+
sink_errLine(chalk.red(`Error parsing context parameters: ${msg}`));
|
|
62
|
+
return envelope_error('');
|
|
88
63
|
}
|
|
89
64
|
}
|
|
90
65
|
// 3. Set default context params if not provided
|
|
91
66
|
const cwd = await session.getCWD();
|
|
92
67
|
const isInFeed = cwd.includes('/feeds/feed_');
|
|
93
68
|
// If no context params provided and not in a feed, use directory name as feed title
|
|
94
|
-
if (
|
|
69
|
+
if (contextArgTokens.length === 0 && !isInFeed) {
|
|
95
70
|
const defaultTitle = cwd.split('/').pop() || 'Untitled';
|
|
96
71
|
contextParams.feed_title = defaultTitle;
|
|
97
|
-
|
|
72
|
+
sink_dataLine(chalk.cyan(`Using feed title: "${defaultTitle}" (customize with -- feed_title="Custom Title")`));
|
|
98
73
|
}
|
|
99
74
|
// 4. Get /bin listing for finding pl-dircopy
|
|
100
75
|
const binResult = await vfs.data_get('/bin');
|
|
101
76
|
if (!binResult.ok) {
|
|
102
|
-
|
|
103
|
-
return;
|
|
77
|
+
sink_errLine(chalk.red('Failed to access /bin directory'));
|
|
78
|
+
return envelope_error('');
|
|
104
79
|
}
|
|
105
80
|
const binListing = binResult.value.map((item) => item.name);
|
|
106
81
|
// 5. Convert plugin name from /bin format to ChRIS search format
|
|
107
82
|
// Example: pl-dcm2niix-v1.0.2 → name_exact:pl-dcm2niix,version:1.0.2
|
|
108
|
-
const pluginSearchString =
|
|
83
|
+
const pluginSearchString = pluginSelector_normalize(pluginName);
|
|
109
84
|
// 6. Execute via salsa
|
|
110
85
|
const result = await plugin_executeInPlace(pluginSearchString, pluginParams, contextParams, cwd, binListing);
|
|
111
86
|
if (!result) {
|
|
112
87
|
// Display all errors from the stack for better debugging
|
|
113
|
-
|
|
88
|
+
sink_errLine(chalk.red('Plugin execution failed:'));
|
|
114
89
|
let error = errorStack.stack_pop();
|
|
115
90
|
while (error) {
|
|
116
|
-
|
|
91
|
+
sink_errLine(chalk.red(` - ${error.message}`));
|
|
117
92
|
error = errorStack.stack_pop();
|
|
118
93
|
}
|
|
119
|
-
return;
|
|
94
|
+
return envelope_error('');
|
|
120
95
|
}
|
|
121
96
|
// 7. Push to procCache so /proc reflects new jobs immediately
|
|
122
97
|
if (result.feedID !== undefined && result.dircopyInstanceID !== undefined) {
|
|
123
98
|
// New feed: push dircopy root node + plugin node
|
|
124
|
-
const feedTitle =
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
id: result.dircopyInstanceID, feedID: result.feedID,
|
|
134
|
-
parentID: null, pluginName: 'pl-dircopy', params: null, status: 'scheduled',
|
|
135
|
-
});
|
|
136
|
-
procCache_get().instance_add({
|
|
137
|
-
id: result.pluginInstanceID, feedID: result.feedID,
|
|
138
|
-
parentID: result.dircopyInstanceID, pluginName: result.pluginName, params: null, status: 'scheduled',
|
|
99
|
+
const feedTitle = typeof contextParams.feed_title === 'string'
|
|
100
|
+
? contextParams.feed_title
|
|
101
|
+
: cwd.split('/').pop() || `feed_${result.feedID}`;
|
|
102
|
+
newFeed_cacheAdd({
|
|
103
|
+
feedID: result.feedID,
|
|
104
|
+
title: feedTitle,
|
|
105
|
+
ownerUsername: cwd.split('/')[2] ?? '',
|
|
106
|
+
rootInstanceID: result.dircopyInstanceID,
|
|
107
|
+
child: { id: result.pluginInstanceID, pluginName: result.pluginName },
|
|
139
108
|
});
|
|
140
109
|
}
|
|
141
110
|
else if (result.parentID !== null) {
|
|
@@ -153,14 +122,16 @@ export async function builtin_executePlugin(pluginName, args) {
|
|
|
153
122
|
}
|
|
154
123
|
// 8. Render output
|
|
155
124
|
if (result.feedID) {
|
|
156
|
-
|
|
125
|
+
sink_dataLine(chalk.green(`Feed created: ${result.feedID}`));
|
|
157
126
|
}
|
|
158
|
-
|
|
159
|
-
|
|
127
|
+
sink_dataLine(chalk.green(`Job scheduled: ${pluginName} (ID: ${result.pluginInstanceID})`));
|
|
128
|
+
sink_dataLine(chalk.cyan(`Output will be in: ${result.outputPath}`));
|
|
129
|
+
return envelope_ok('');
|
|
160
130
|
}
|
|
161
131
|
catch (error) {
|
|
162
132
|
const msg = error instanceof Error ? error.message : String(error);
|
|
163
|
-
|
|
133
|
+
sink_errLine(chalk.red(`Error executing plugin: ${msg}`));
|
|
134
|
+
return envelope_error('');
|
|
164
135
|
}
|
|
165
136
|
}
|
|
166
137
|
//# sourceMappingURL=pluginExecute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pluginExecute.js","sourceRoot":"","sources":["../../src/builtins/pluginExecute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAyB,MAAM,eAAe,CAAC;AAC7E,OAAO,
|
|
1
|
+
{"version":3,"file":"pluginExecute.js","sourceRoot":"","sources":["../../src/builtins/pluginExecute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Shared normalization for plugin executable selectors.
|
|
3
|
+
*
|
|
4
|
+
* Direct execution and composite commands use this module to resolve `/bin`-style
|
|
5
|
+
* plugin names through the same exact-name and optional-version query grammar.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Normalize a `/bin` plugin name into a ChRIS plugin search selector.
|
|
11
|
+
*
|
|
12
|
+
* @param selector - Plugin name, optionally ending in `-v<version>`.
|
|
13
|
+
* @returns Exact-name selector with an exact version when one was supplied.
|
|
14
|
+
*/
|
|
15
|
+
export declare function pluginSelector_normalize(selector: string): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Shared normalization for plugin executable selectors.
|
|
3
|
+
*
|
|
4
|
+
* Direct execution and composite commands use this module to resolve `/bin`-style
|
|
5
|
+
* plugin names through the same exact-name and optional-version query grammar.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Normalize a `/bin` plugin name into a ChRIS plugin search selector.
|
|
11
|
+
*
|
|
12
|
+
* @param selector - Plugin name, optionally ending in `-v<version>`.
|
|
13
|
+
* @returns Exact-name selector with an exact version when one was supplied.
|
|
14
|
+
*/
|
|
15
|
+
export function pluginSelector_normalize(selector) {
|
|
16
|
+
const match = selector.match(/^(.+)-v(.+)$/);
|
|
17
|
+
if (match === null)
|
|
18
|
+
return `name_exact:${selector}`;
|
|
19
|
+
return `name_exact:${match[1]},version:${match[2]}`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=pluginSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginSelector.js","sourceRoot":"","sources":["../../src/builtins/pluginSelector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,KAAK,GAA4B,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,cAAc,QAAQ,EAAE,CAAC;IACpD,OAAO,cAAc,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC"}
|