@fnndsc/brasa 0.46.0 → 0.47.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 -1
- package/dist/builtins/fs/pull.js +23 -0
- package/dist/builtins/fs/pull.js.map +1 -1
- package/dist/builtins/help.js +55 -0
- package/dist/builtins/help.js.map +1 -1
- package/dist/builtins/net/query.d.ts +3 -21
- package/dist/builtins/net/query.js +4 -65
- package/dist/builtins/net/query.js.map +1 -1
- package/dist/builtins/net/query.model.d.ts +31 -0
- package/dist/builtins/net/query.model.js +66 -0
- package/dist/builtins/net/query.model.js.map +1 -0
- package/dist/builtins/res/expect.d.ts +38 -0
- package/dist/builtins/res/expect.js +77 -182
- package/dist/builtins/res/expect.js.map +1 -1
- package/dist/builtins/res/gather.facts.d.ts +18 -0
- package/dist/builtins/res/gather.facts.js +114 -0
- package/dist/builtins/res/gather.facts.js.map +1 -0
- package/dist/builtins/res/gather.js +40 -9
- package/dist/builtins/res/gather.js.map +1 -1
- package/dist/builtins/res/gather.process.d.ts +17 -0
- package/dist/builtins/res/gather.process.js +58 -5
- package/dist/builtins/res/gather.process.js.map +1 -1
- package/dist/builtins/res/gather.store.d.ts +36 -0
- package/dist/builtins/res/gather.store.js +105 -2
- package/dist/builtins/res/gather.store.js.map +1 -1
- package/dist/builtins/res/play.js +29 -10
- package/dist/builtins/res/play.js.map +1 -1
- package/dist/builtins/variablesPage.js +2 -0
- package/dist/builtins/variablesPage.js.map +1 -1
- package/dist/chris/backend.js +2 -0
- package/dist/chris/backend.js.map +1 -1
- package/dist/chris/binExecutables.d.ts +7 -1
- package/dist/chris/binExecutables.js +13 -3
- package/dist/chris/binExecutables.js.map +1 -1
- package/dist/chris/chrisCommands.js +0 -6
- package/dist/chris/chrisCommands.js.map +1 -1
- package/dist/chris/commandFallback.js +4 -2
- package/dist/chris/commandFallback.js.map +1 -1
- package/dist/chris/expectSubjects.d.ts +3 -0
- package/dist/chris/expectSubjects.js +131 -0
- package/dist/chris/expectSubjects.js.map +1 -0
- package/dist/chris/help.js +10 -55
- package/dist/chris/help.js.map +1 -1
- package/dist/core/backend.d.ts +38 -0
- package/dist/core/backend.js.map +1 -1
- package/dist/core/coreCommands.js +6 -0
- package/dist/core/coreCommands.js.map +1 -1
- package/dist/core/dispatch.js +9 -1
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/pipeHead.d.ts +36 -0
- package/dist/core/pipeHead.js +28 -0
- package/dist/core/pipeHead.js.map +1 -0
- package/dist/core/variables.d.ts +3 -2
- package/dist/core/variables.js +7 -3
- package/dist/core/variables.js.map +1 -1
- package/dist/notes.json +1 -1
- package/package.json +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file Builtin gather command: the session's cohort as a kernel subject.
|
|
3
3
|
*
|
|
4
|
-
* Subcommands: list (the default), add, remove, clear, name.
|
|
4
|
+
* Subcommands: list (the default), add, remove, clear, name, feed, process.
|
|
5
5
|
*
|
|
6
6
|
* Gathering was a surface gesture before it was a verb, which meant the set
|
|
7
7
|
* a session was working on could only be built by pressing on it. As a
|
|
@@ -17,7 +17,8 @@ import chalk from 'chalk';
|
|
|
17
17
|
import path from 'path';
|
|
18
18
|
import { table_render } from '@fnndsc/chili/screen/screen.js';
|
|
19
19
|
import { commandArgs_process, path_resolve } from '../utils.js';
|
|
20
|
-
import { cohort_read, cohort_write, member_key, members_drop, members_merge, pathKind_determine, seriesUID_ofPath, } from './gather.store.js';
|
|
20
|
+
import { cohort_read, cohort_write, cohortModel_of, cohortFolders_resolve, member_key, members_drop, members_merge, pathKind_determine, seriesUID_ofPath, } from './gather.store.js';
|
|
21
|
+
import { placeImagery_is, seriesFacts_fill } from './gather.facts.js';
|
|
21
22
|
import { envelope_ok, envelope_error } from '@fnndsc/menu';
|
|
22
23
|
import { GATHER_MODEL_KIND } from './gather.kind.js';
|
|
23
24
|
export { GATHER_MODEL_KIND };
|
|
@@ -65,7 +66,7 @@ function member_state(member) {
|
|
|
65
66
|
* @returns A success envelope carrying the rendered table and the model.
|
|
66
67
|
*/
|
|
67
68
|
function cohort_render(state) {
|
|
68
|
-
const model =
|
|
69
|
+
const model = cohortModel_of(state);
|
|
69
70
|
if (state.series.length === 0) {
|
|
70
71
|
return envelope_ok(`${chalk.gray('The cohort is empty. Gather something with `gather add <path>`.')}\n`, model);
|
|
71
72
|
}
|
|
@@ -121,12 +122,20 @@ async function gather_add(operands) {
|
|
|
121
122
|
member.seriesUID = uid;
|
|
122
123
|
member.imagery = true;
|
|
123
124
|
}
|
|
125
|
+
else if (placeImagery_is(member)) {
|
|
126
|
+
member.imagery = true;
|
|
127
|
+
}
|
|
124
128
|
incoming.push(member);
|
|
125
129
|
}
|
|
126
|
-
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
await seriesFacts_fill(incoming);
|
|
131
|
+
const read = await cohort_read();
|
|
132
|
+
const { members, added, merged } = members_merge(read.series, incoming);
|
|
133
|
+
read.series = members;
|
|
134
|
+
await cohort_write(read);
|
|
135
|
+
// A series CUBE already holds is known by its folder from the moment it
|
|
136
|
+
// is gathered: that folder is what a surface opens as an image and what
|
|
137
|
+
// `gather process` roots on. One CUBE read for every series still unplaced.
|
|
138
|
+
const state = await cohortFolders_resolve(read);
|
|
130
139
|
const noted = [];
|
|
131
140
|
if (added > 0)
|
|
132
141
|
noted.push(`${added} gathered`);
|
|
@@ -199,7 +208,27 @@ async function gather_name(operands) {
|
|
|
199
208
|
}
|
|
200
209
|
state.name = operands.join(' ');
|
|
201
210
|
await cohort_write(state);
|
|
202
|
-
|
|
211
|
+
// The cohort travels with the answer, as every changing verb's does, so
|
|
212
|
+
// a surface showing it takes the name from here.
|
|
213
|
+
return envelope_ok(`${chalk.green(`gather: the cohort is "${state.name}".`)}\n`, cohortModel_of(state));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Makes the cohort's feed, or names the one it has.
|
|
217
|
+
*
|
|
218
|
+
* @param words - The words after `gather feed`, raw.
|
|
219
|
+
* @returns The cohort, with its feed.
|
|
220
|
+
*/
|
|
221
|
+
async function gather_feed(words) {
|
|
222
|
+
// Loaded on demand, as `process` is: making a feed carries the pull and
|
|
223
|
+
// feed machinery, which the cohort's own verbs never need.
|
|
224
|
+
const { cohortFeed_make } = await import('./gather.process.js');
|
|
225
|
+
const made = await cohortFeed_make(words);
|
|
226
|
+
if (typeof made === 'string')
|
|
227
|
+
return gather_error(`gather feed: ${made}`);
|
|
228
|
+
const feedId = made.state.feed?.feedId;
|
|
229
|
+
const said = made.made ? `gather: the cohort's feed is ${feedId}, made now.` : `gather: the cohort's feed is ${feedId}.`;
|
|
230
|
+
const envelope = cohort_render(made.state);
|
|
231
|
+
return envelope_ok(`${chalk.green(said)}\n${envelope.rendered}`, envelope.model);
|
|
203
232
|
}
|
|
204
233
|
/**
|
|
205
234
|
* Builtin handler for the `gather` command.
|
|
@@ -242,10 +271,12 @@ export async function builtin_gather(args) {
|
|
|
242
271
|
}
|
|
243
272
|
if (subcommand === 'name')
|
|
244
273
|
return await gather_name(operands);
|
|
274
|
+
if (subcommand === 'feed')
|
|
275
|
+
return await gather_feed(args.slice(args.indexOf('feed') + 1));
|
|
245
276
|
}
|
|
246
277
|
catch (e) {
|
|
247
278
|
return gather_error(`gather: ${e instanceof Error ? e.message : String(e)}`);
|
|
248
279
|
}
|
|
249
|
-
return gather_error(`Unknown subcommand: ${subcommand}. Usage: gather <list|add|remove|clear|name|process>`);
|
|
280
|
+
return gather_error(`Unknown subcommand: ${subcommand}. Usage: gather <list|add|remove|clear|name|feed|process>`);
|
|
250
281
|
}
|
|
251
282
|
//# sourceMappingURL=gather.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAqB,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAuB,MAAM,yBAAyB,CAAC;AACrH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAIL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAmB,WAAW,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAqB,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAuB,MAAM,yBAAyB,CAAC;AACrH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAIL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAsB,MAAM,cAAc,CAAC;AAEhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;;;GAKG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,MAAoB;IACxC,MAAM,SAAS,GAAY,MAAM,CAAC,WAAW,CAAC;IAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,MAAoB;IACxC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAY,MAAM,CAAC,UAAU,CAAC;IAC1C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,KAAkB;IACvC,MAAM,KAAK,GAAkB,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClH,CAAC;IAED,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,QAAQ,GAAqB,kBAAkB,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,KAAK,GAAwB,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAU,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5H,MAAM,IAAI,GAA8B,KAAK,CAAC,MAAM,CAAC,GAAG,CACtD,CAAC,MAAoB,EAA2B,EAAE,CAAC,CAAC;QAClD,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;QAC7D,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC,OAAO;KACrB,CAAC,CACH,CAAC;IACF,MAAM,WAAW,GAAW,KAAK,CAAC,MAAM,CAAC,MAAM,CAC7C,CAAC,MAAoB,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAC5D,CAAC,MAAM,CAAC;IACT,MAAM,UAAU,GAAW,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7F,IAAI,UAAU,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzF,MAAM,KAAK,GAAW,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;IAEhF,OAAO,WAAW,CAChB,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;QAC9D,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE;KAC1C,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAClH,KAAK,CACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,UAAU,CAAC,QAAkB;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,oCAAoC,CAAC,CAAC;IAErF,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAW,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,IAAI,GAAsB,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnE,mEAAmE;QACnE,uEAAuE;QACvE,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,YAAY,CAAC,WAAW,QAAQ,qBAAqB,CAAC,CAAC;QACjF,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAuB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;YAC9C,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAgB,MAAM,WAAW,EAAE,CAAC;IAC9C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACtB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,wEAAwE;IACxE,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,KAAK,GAAgB,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;IAC/C,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,wBAAwB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAoB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7G,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,aAAa,CAAC,QAAkB;IAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,mDAAmD,CAAC,CAAC;IAEpG,MAAM,KAAK,GAAgB,MAAM,WAAW,EAAE,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,8BAA8B,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAW,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YACzE,MAAM,MAAM,GAA6B,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,YAAY,CAAC,qBAAqB,OAAO,uBAAuB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACzH,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAoB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,OAAO,WAAW,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5G,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,YAAY;IACzB,MAAM,KAAK,GAAgB,MAAM,WAAW,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAW,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,OAAO,GAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5F,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAoB,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9I,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CAAC,QAAkB;IAC3C,MAAM,KAAK,GAAgB,MAAM,WAAW,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAC1F,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1B,wEAAwE;IACxE,iDAAiD;IACjD,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CAAC,KAA4B;IACrD,wEAAwE;IACxE,2DAA2D;IAC3D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAChE,MAAM,IAAI,GAAmD,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1F,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;IAC3D,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gCAAgC,MAAM,aAAa,CAAC,CAAC,CAAC,gCAAgC,MAAM,GAAG,CAAC;IACjI,MAAM,QAAQ,GAAoB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,MAAM,GAAe,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAuB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,MAAM;YAAE,OAAO,aAAa,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;QACjG,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3E,oEAAoE;YACpE,oEAAoE;YACpE,kEAAkE;YAClE,IAAI,KAAK,GAAa,QAAQ,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAwB,cAAc,EAAE,CAAC;gBACpD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,OAAO,YAAY,CAAC,UAAU,UAAU,8FAA8F,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;gBACxL,CAAC;gBACD,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,YAAY,CAAC,UAAU,UAAU,yCAAyC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC1J,CAAC;YACD,OAAO,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,UAAU,KAAK,OAAO;YAAE,OAAO,MAAM,YAAY,EAAE,CAAC;QACxD,uEAAuE;QACvE,uCAAuC;QACvC,uEAAuE;QACvE,2CAA2C;QAC3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC/D,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,UAAU,KAAK,MAAM;YAAE,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,UAAU,KAAK,MAAM;YAAE,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,YAAY,CAAC,uBAAuB,UAAU,2DAA2D,CAAC,CAAC;AACpH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CommandEnvelope } from '@fnndsc/menu';
|
|
2
|
+
import { type GatherState } from './gather.store.js';
|
|
2
3
|
/** How `gather process` was asked for. */
|
|
3
4
|
export interface GatherProcessArgs {
|
|
4
5
|
/** The plugin or pipeline, as `/bin` names it. */
|
|
@@ -19,6 +20,22 @@ export interface GatherProcessArgs {
|
|
|
19
20
|
* @returns The request, or why it is not one.
|
|
20
21
|
*/
|
|
21
22
|
export declare function gatherProcessArgs_parse(words: ReadonlyArray<string>): GatherProcessArgs;
|
|
23
|
+
/**
|
|
24
|
+
* `gather feed [--title T]`: the cohort's feed, made now when it has none.
|
|
25
|
+
*
|
|
26
|
+
* The feed is rooted on every member's place, so a series still at the
|
|
27
|
+
* PACS is pulled first (one `pull` over all of them); a folder or a file is
|
|
28
|
+
* already in CUBE and goes into the root as it is. The feed is noted on the
|
|
29
|
+
* cohort, which is what a later `gather process` runs off and what a
|
|
30
|
+
* surface reads it from.
|
|
31
|
+
*
|
|
32
|
+
* @param words - The words after `gather feed`, raw.
|
|
33
|
+
* @returns The cohort with its feed, and whether the feed was made now; or a refusal.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cohortFeed_make(words: ReadonlyArray<string>): Promise<{
|
|
36
|
+
state: GatherState;
|
|
37
|
+
made: boolean;
|
|
38
|
+
} | string>;
|
|
22
39
|
/**
|
|
23
40
|
* `gather process <name> [--title T] [--detach] [-- args]`: runs a plugin or
|
|
24
41
|
* a pipeline once over the whole cohort.
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* is in the data the plugin reads. This is the shape ARGUS's PROCESS builds
|
|
8
8
|
* from a press (#597), so a manifest and a press make the same feed.
|
|
9
9
|
*
|
|
10
|
-
* When the cohort already has a feed (
|
|
11
|
-
*
|
|
10
|
+
* When the cohort already has a feed (`gather feed`, which ARGUS's CREATE
|
|
11
|
+
* FEED sends, noted it on the cohort), the run goes off that feed's root and
|
|
12
12
|
* nothing is copied twice; otherwise the feed is made here and noted on the
|
|
13
13
|
* cohort for the next run. The name resolves as a bare line resolves it in
|
|
14
14
|
* `/bin`. A series not pulled yet has no folder to copy, and the verb refuses
|
|
@@ -28,7 +28,7 @@ import { binExecutableMatches_get } from '../../chris/binExecutables.js';
|
|
|
28
28
|
import { builtin_executePlugin } from '../pluginExecute.js';
|
|
29
29
|
import { builtin_pipeline } from './pipeline.js';
|
|
30
30
|
import { newFeed_cacheAdd, run_follow } from '../feedCreation.js';
|
|
31
|
-
import { cohort_read, cohort_write } from './gather.store.js';
|
|
31
|
+
import { cohort_read, cohort_write, cohortFolders_resolve } from './gather.store.js';
|
|
32
32
|
/** The usage line a refusal points at. */
|
|
33
33
|
const USAGE = 'gather process <plugin|pipeline> [--title T] [--detach] [-- <its arguments>]';
|
|
34
34
|
/**
|
|
@@ -130,6 +130,55 @@ async function cohortFeed_ensure(state, places, title) {
|
|
|
130
130
|
sink_dataLine(chalk.green(`Feed created: ${feedId} (${places.length} member${places.length === 1 ? '' : 's'} in its root, ${rootInstanceId})`));
|
|
131
131
|
return { feed: made, made: true };
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* `gather feed [--title T]`: the cohort's feed, made now when it has none.
|
|
135
|
+
*
|
|
136
|
+
* The feed is rooted on every member's place, so a series still at the
|
|
137
|
+
* PACS is pulled first (one `pull` over all of them); a folder or a file is
|
|
138
|
+
* already in CUBE and goes into the root as it is. The feed is noted on the
|
|
139
|
+
* cohort, which is what a later `gather process` runs off and what a
|
|
140
|
+
* surface reads it from.
|
|
141
|
+
*
|
|
142
|
+
* @param words - The words after `gather feed`, raw.
|
|
143
|
+
* @returns The cohort with its feed, and whether the feed was made now; or a refusal.
|
|
144
|
+
*/
|
|
145
|
+
export async function cohortFeed_make(words) {
|
|
146
|
+
let title = null;
|
|
147
|
+
for (let at = 0; at < words.length; at++) {
|
|
148
|
+
const word = words[at];
|
|
149
|
+
if (word === '--title') {
|
|
150
|
+
const given = words[at + 1];
|
|
151
|
+
if (given === undefined || given.startsWith('--') || given.trim() === '')
|
|
152
|
+
return '--title needs a title';
|
|
153
|
+
title = given.trim();
|
|
154
|
+
at++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
return `${word}: not understood. Usage: gather feed [--title T]`;
|
|
158
|
+
}
|
|
159
|
+
let state = await cohortFolders_resolve(await cohort_read());
|
|
160
|
+
if (state.series.length === 0)
|
|
161
|
+
return 'the cohort is empty; gather add something first';
|
|
162
|
+
if (state.feed !== null)
|
|
163
|
+
return { state, made: false };
|
|
164
|
+
const away = state.series.filter((member) => member_place(member) === null);
|
|
165
|
+
if (away.length > 0) {
|
|
166
|
+
// Loaded on demand: only a cohort with series still at the PACS pulls.
|
|
167
|
+
const { builtin_pull } = await import('../fs/pull.js');
|
|
168
|
+
await builtin_pull(away.map((member) => member.vfsPath));
|
|
169
|
+
state = await cohortFolders_resolve(await cohort_read());
|
|
170
|
+
const waiting = state.series.filter((member) => member_place(member) === null);
|
|
171
|
+
if (waiting.length > 0) {
|
|
172
|
+
const named = waiting.slice(0, 5).map(member_word).join(', ') + (waiting.length > 5 ? `, and ${waiting.length - 5} more` : '');
|
|
173
|
+
return `${waiting.length} series did not land (${named}); no feed was made`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const places = state.series.map((member) => member_place(member));
|
|
177
|
+
const ensured = await cohortFeed_ensure(state, places, title ?? state.name ?? 'cohort');
|
|
178
|
+
if (typeof ensured === 'string')
|
|
179
|
+
return ensured;
|
|
180
|
+
return { state: { ...state, feed: ensured.feed }, made: ensured.made };
|
|
181
|
+
}
|
|
133
182
|
/**
|
|
134
183
|
* `gather process <name> [--title T] [--detach] [-- args]`: runs a plugin or
|
|
135
184
|
* a pipeline once over the whole cohort.
|
|
@@ -142,7 +191,9 @@ export async function gather_process(words) {
|
|
|
142
191
|
if (parsed.error !== null || parsed.name === null)
|
|
143
192
|
return process_refuse(parsed.error ?? USAGE);
|
|
144
193
|
const name = parsed.name;
|
|
145
|
-
|
|
194
|
+
// A series pulled but not yet noted on the cohort is found in CUBE, not
|
|
195
|
+
// refused as never pulled.
|
|
196
|
+
const state = await cohortFolders_resolve(await cohort_read());
|
|
146
197
|
if (state.series.length === 0)
|
|
147
198
|
return process_refuse('the cohort is empty; gather add something first');
|
|
148
199
|
const waiting = state.series.filter((member) => member_place(member) === null);
|
|
@@ -165,7 +216,9 @@ export async function gather_process(words) {
|
|
|
165
216
|
const { feed, made } = ensured;
|
|
166
217
|
const detach = parsed.detach ? ['--detach'] : [];
|
|
167
218
|
const envelope = matches.pipeline !== undefined
|
|
168
|
-
|
|
219
|
+
// By its /bin name, which names the id: a pipeline found by its CUBE
|
|
220
|
+
// name runs as exactly that one.
|
|
221
|
+
? await builtin_pipeline(['run', matches.pipeline.name, '--previous', String(feed.rootInstanceId), ...detach, ...parsed.forwarded])
|
|
169
222
|
: await builtin_executePlugin(name, [...detach, ...parsed.forwarded], feed.path);
|
|
170
223
|
// The run went off a root, so it reads as continuing a feed; when that
|
|
171
224
|
// feed was made by this line, the answer says so, as a bare run's would.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather.process.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,cAAc,EAAwB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAA6B,MAAM,+BAA+B,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAwD,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"gather.process.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { EnvelopeModel } from '@fnndsc/menu';
|
|
1
2
|
/** Where the session keeps the cohort it is working on. */
|
|
2
3
|
export declare const COHORT_FILE: string;
|
|
3
4
|
/** The directory that holds it, created on first write. */
|
|
@@ -57,6 +58,16 @@ export interface GatherState {
|
|
|
57
58
|
}
|
|
58
59
|
/** An empty cohort: what a session that has gathered nothing holds. */
|
|
59
60
|
export declare function cohortState_empty(): GatherState;
|
|
61
|
+
/**
|
|
62
|
+
* The cohort as the model it travels in.
|
|
63
|
+
*
|
|
64
|
+
* Every verb that changes the cohort answers with it, so a surface showing
|
|
65
|
+
* the cohort redraws from the kernel's copy and never keeps one of its own.
|
|
66
|
+
*
|
|
67
|
+
* @param state - The cohort.
|
|
68
|
+
* @returns The `gather.cohort` model.
|
|
69
|
+
*/
|
|
70
|
+
export declare function cohortModel_of(state: GatherState): EnvelopeModel;
|
|
60
71
|
/**
|
|
61
72
|
* The identity of one member.
|
|
62
73
|
*
|
|
@@ -101,10 +112,35 @@ export declare function pathKind_determine(address: string): Promise<GatherKind
|
|
|
101
112
|
/**
|
|
102
113
|
* The series UID a PACS projection path names, when it names one.
|
|
103
114
|
*
|
|
115
|
+
* A query's answer names a series `Series_<uid>_<description>`; a path may
|
|
116
|
+
* also end in the bare UID.
|
|
117
|
+
*
|
|
104
118
|
* @param address - A resolved VFS path.
|
|
105
119
|
* @returns The UID, or undefined when the path is not a series projection.
|
|
106
120
|
*/
|
|
107
121
|
export declare function seriesUID_ofPath(address: string): string | undefined;
|
|
122
|
+
/**
|
|
123
|
+
* Notes on the cohort where the series a pull fetched landed.
|
|
124
|
+
*
|
|
125
|
+
* The pull knows each folder the moment CUBE files it; a member that stands
|
|
126
|
+
* for one of those series takes the folder, so the cohort reads as home
|
|
127
|
+
* without asking CUBE again.
|
|
128
|
+
*
|
|
129
|
+
* @param landed - Series UID to the CUBE folder it landed in.
|
|
130
|
+
* @returns How many members changed.
|
|
131
|
+
*/
|
|
132
|
+
export declare function cohortFolders_note(landed: ReadonlyMap<string, string>): Promise<number>;
|
|
133
|
+
/**
|
|
134
|
+
* Asks CUBE where any series member not yet known to be home landed.
|
|
135
|
+
*
|
|
136
|
+
* CUBE is the truth and the cohort file a cache of it: a series pulled
|
|
137
|
+
* earlier, by a surface or in another session, or a folder a surface's
|
|
138
|
+
* rewrite dropped, is found again here rather than read as never pulled.
|
|
139
|
+
*
|
|
140
|
+
* @param state - The cohort, changed in place.
|
|
141
|
+
* @returns The cohort, with every folder CUBE could name; written back when it changed.
|
|
142
|
+
*/
|
|
143
|
+
export declare function cohortFolders_resolve(state: GatherState): Promise<GatherState>;
|
|
108
144
|
/**
|
|
109
145
|
* Takes members into a cohort, merging what a later sighting knows.
|
|
110
146
|
*
|
|
@@ -22,11 +22,12 @@
|
|
|
22
22
|
* @module
|
|
23
23
|
*/
|
|
24
24
|
import path from 'path';
|
|
25
|
-
import { listCache_get } from '@fnndsc/cumin';
|
|
25
|
+
import { listCache_get, seriesStorage_resolveMany } from '@fnndsc/cumin';
|
|
26
26
|
import { fileContent_get, files_path_isDirectory } from '@fnndsc/salsa';
|
|
27
27
|
import { files_touch as chefs_touch_cmd } from '@fnndsc/chili/commands/fs/touch.js';
|
|
28
28
|
import { files_mkdir as chefs_mkdir_cmd } from '@fnndsc/chili/commands/fs/mkdir.js';
|
|
29
29
|
import { path_resolve } from '../utils.js';
|
|
30
|
+
import { GATHER_MODEL_KIND } from './gather.kind.js';
|
|
30
31
|
/** Where the session keeps the cohort it is working on. */
|
|
31
32
|
export const COHORT_FILE = '~/gather/current.json';
|
|
32
33
|
/** The directory that holds it, created on first write. */
|
|
@@ -35,6 +36,18 @@ export const COHORT_DIR = '~/gather';
|
|
|
35
36
|
export function cohortState_empty() {
|
|
36
37
|
return { version: 1, name: null, feed: null, series: [] };
|
|
37
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The cohort as the model it travels in.
|
|
41
|
+
*
|
|
42
|
+
* Every verb that changes the cohort answers with it, so a surface showing
|
|
43
|
+
* the cohort redraws from the kernel's copy and never keeps one of its own.
|
|
44
|
+
*
|
|
45
|
+
* @param state - The cohort.
|
|
46
|
+
* @returns The `gather.cohort` model.
|
|
47
|
+
*/
|
|
48
|
+
export function cohortModel_of(state) {
|
|
49
|
+
return { kind: GATHER_MODEL_KIND, data: state };
|
|
50
|
+
}
|
|
38
51
|
/**
|
|
39
52
|
* The identity of one member.
|
|
40
53
|
*
|
|
@@ -164,12 +177,102 @@ async function folderEntries_list(folder) {
|
|
|
164
177
|
/**
|
|
165
178
|
* The series UID a PACS projection path names, when it names one.
|
|
166
179
|
*
|
|
180
|
+
* A query's answer names a series `Series_<uid>_<description>`; a path may
|
|
181
|
+
* also end in the bare UID.
|
|
182
|
+
*
|
|
167
183
|
* @param address - A resolved VFS path.
|
|
168
184
|
* @returns The UID, or undefined when the path is not a series projection.
|
|
169
185
|
*/
|
|
170
186
|
export function seriesUID_ofPath(address) {
|
|
171
187
|
const leaf = path.posix.basename(address);
|
|
172
|
-
|
|
188
|
+
if (/^[0-9]+(\.[0-9]+)+$/.test(leaf))
|
|
189
|
+
return leaf;
|
|
190
|
+
const named = leaf.match(/^Series_([0-9]+(?:\.[0-9]+)+)(?:_|$)/);
|
|
191
|
+
return named === null ? undefined : named[1];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The series UID a member stands for, when it is a series.
|
|
195
|
+
*
|
|
196
|
+
* @param member - A cohort member.
|
|
197
|
+
* @returns The UID it carries, else the one its path names.
|
|
198
|
+
*/
|
|
199
|
+
function memberSeriesUID_get(member) {
|
|
200
|
+
if (member.kind !== 'series')
|
|
201
|
+
return undefined;
|
|
202
|
+
return typeof member.seriesUID === 'string' && member.seriesUID.length > 0
|
|
203
|
+
? member.seriesUID
|
|
204
|
+
: seriesUID_ofPath(member.vfsPath);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Writes where series landed onto the members that stand for them.
|
|
208
|
+
*
|
|
209
|
+
* @param state - The cohort, changed in place.
|
|
210
|
+
* @param landed - Series UID to the CUBE folder it landed in.
|
|
211
|
+
* @returns How many members changed.
|
|
212
|
+
*/
|
|
213
|
+
function memberFolders_apply(state, landed) {
|
|
214
|
+
let changed = 0;
|
|
215
|
+
for (const member of state.series) {
|
|
216
|
+
const uid = memberSeriesUID_get(member);
|
|
217
|
+
if (uid === undefined)
|
|
218
|
+
continue;
|
|
219
|
+
const folder = landed.get(uid);
|
|
220
|
+
if (folder === undefined || member.folderPath === folder)
|
|
221
|
+
continue;
|
|
222
|
+
member.seriesUID = uid;
|
|
223
|
+
member.folderPath = folder;
|
|
224
|
+
changed += 1;
|
|
225
|
+
}
|
|
226
|
+
return changed;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Notes on the cohort where the series a pull fetched landed.
|
|
230
|
+
*
|
|
231
|
+
* The pull knows each folder the moment CUBE files it; a member that stands
|
|
232
|
+
* for one of those series takes the folder, so the cohort reads as home
|
|
233
|
+
* without asking CUBE again.
|
|
234
|
+
*
|
|
235
|
+
* @param landed - Series UID to the CUBE folder it landed in.
|
|
236
|
+
* @returns How many members changed.
|
|
237
|
+
*/
|
|
238
|
+
export async function cohortFolders_note(landed) {
|
|
239
|
+
if (landed.size === 0)
|
|
240
|
+
return 0;
|
|
241
|
+
const state = await cohort_read();
|
|
242
|
+
const changed = memberFolders_apply(state, landed);
|
|
243
|
+
if (changed > 0)
|
|
244
|
+
await cohort_write(state);
|
|
245
|
+
return changed;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Asks CUBE where any series member not yet known to be home landed.
|
|
249
|
+
*
|
|
250
|
+
* CUBE is the truth and the cohort file a cache of it: a series pulled
|
|
251
|
+
* earlier, by a surface or in another session, or a folder a surface's
|
|
252
|
+
* rewrite dropped, is found again here rather than read as never pulled.
|
|
253
|
+
*
|
|
254
|
+
* @param state - The cohort, changed in place.
|
|
255
|
+
* @returns The cohort, with every folder CUBE could name; written back when it changed.
|
|
256
|
+
*/
|
|
257
|
+
export async function cohortFolders_resolve(state) {
|
|
258
|
+
const uids = [...new Set(state.series
|
|
259
|
+
.filter((member) => typeof member.folderPath !== 'string' || member.folderPath.length === 0)
|
|
260
|
+
.map(memberSeriesUID_get)
|
|
261
|
+
.filter((uid) => uid !== undefined))];
|
|
262
|
+
if (uids.length === 0)
|
|
263
|
+
return state;
|
|
264
|
+
const filters = uids.map((uid) => ({ SeriesInstanceUID: uid }));
|
|
265
|
+
const found = await seriesStorage_resolveMany(filters, { counts: false });
|
|
266
|
+
if (!found.ok)
|
|
267
|
+
return state;
|
|
268
|
+
const landed = new Map();
|
|
269
|
+
for (const [uid, storage] of found.value) {
|
|
270
|
+
if (storage.folderPath !== null)
|
|
271
|
+
landed.set(uid, storage.folderPath);
|
|
272
|
+
}
|
|
273
|
+
if (memberFolders_apply(state, landed) > 0)
|
|
274
|
+
await cohort_write(state);
|
|
275
|
+
return state;
|
|
173
276
|
}
|
|
174
277
|
/**
|
|
175
278
|
* Takes members into a cohort, merging what a later sighting knows.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather.store.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"gather.store.js","sourceRoot":"","sources":["../../../src/builtins/res/gather.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,12 +20,13 @@
|
|
|
20
20
|
* @module
|
|
21
21
|
*/
|
|
22
22
|
import chalk from 'chalk';
|
|
23
|
-
import { fileContent_get } from '@fnndsc/salsa';
|
|
24
23
|
import { path_resolve } from '../utils.js';
|
|
25
24
|
import { duration_parse } from '../../lib/duration.js';
|
|
26
25
|
import { recorder_mute, recorder_unmute } from '../../session/recorder.js';
|
|
27
26
|
import { sink_dataLine, sink_errLine } from '../../core/sink.js';
|
|
28
27
|
import { commandCancellation_enable, commandCancellation_signalGet } from '../../core/cancellation.js';
|
|
28
|
+
import { backendInstalled_get } from '../../core/backend.js';
|
|
29
|
+
import { exitCode_read } from '../../core/handlerRun.js';
|
|
29
30
|
import { reference_isReserved, reference_resolve, unresolvedStands_run } from '../../core/expansion.js';
|
|
30
31
|
import { VARIABLE_NAME, variable_get, variableScope_run } from '../../core/variables.js';
|
|
31
32
|
import { shellWords_referencesExpand, shellWords_tokenize } from '../../lib/parser.js';
|
|
@@ -110,7 +111,8 @@ async function pause_take(ms, signal) {
|
|
|
110
111
|
});
|
|
111
112
|
}
|
|
112
113
|
/**
|
|
113
|
-
* Reads a manifest, from the
|
|
114
|
+
* Reads a manifest, from the backend's filesystem (ChRIS: CFS) or from the
|
|
115
|
+
* engine's own disk.
|
|
114
116
|
*
|
|
115
117
|
* A manifest is a ChRIS file: that is what makes one shareable, and sharing
|
|
116
118
|
* it is `setfacl`, like any other file. But a repository's battery lives
|
|
@@ -127,11 +129,19 @@ async function manifestText_read(target) {
|
|
|
127
129
|
// Asking CFS is how we find out whether the manifest lives there. The
|
|
128
130
|
// miss is an ANSWER, not a fault: left on the stack it made a play that
|
|
129
131
|
// ran a host-side battery perfectly exit non-zero.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
132
|
+
// The backend's files are asked first (ChRIS: CFS); a backend with no
|
|
133
|
+
// files of its own (stratus) has only the engine's disk.
|
|
134
|
+
const files = backendInstalled_get()?.files;
|
|
135
|
+
if (files !== undefined) {
|
|
136
|
+
const mark = errorStack.checkpoint_mark();
|
|
137
|
+
try {
|
|
138
|
+
const bytes = await files.read(resolved);
|
|
139
|
+
return { ok: true, value: { text: bytes.toString('utf8'), from: resolved } };
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
errorStack.checkpoint_drain(mark);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
135
145
|
try {
|
|
136
146
|
const { readFile } = await import('node:fs/promises');
|
|
137
147
|
const text = await readFile(target, 'utf8');
|
|
@@ -246,7 +256,7 @@ export async function builtin_play(args) {
|
|
|
246
256
|
const source = await manifestText_read(parsed.manifest);
|
|
247
257
|
if (!source.ok) {
|
|
248
258
|
process.exitCode = 1;
|
|
249
|
-
return envelope_error('', undefined, `${chalk.red(`play: cannot read ${parsed.manifest} — no such manifest in the
|
|
259
|
+
return envelope_error('', undefined, `${chalk.red(`play: cannot read ${parsed.manifest} — no such manifest in the session's filesystem, and none beside the engine.`)}\n`);
|
|
250
260
|
}
|
|
251
261
|
const manifest = manifest_parse(source.value.text);
|
|
252
262
|
// A manifest may not take a name the session answers for: shadowing a
|
|
@@ -294,6 +304,7 @@ export async function builtin_play(args) {
|
|
|
294
304
|
let stoppedAt = null;
|
|
295
305
|
// What the manifest answers with, read before its scope ends with it.
|
|
296
306
|
let answered;
|
|
307
|
+
const exitBeforePlay = exitCode_read();
|
|
297
308
|
depth += 1;
|
|
298
309
|
// What a play runs is already written down in the file it is playing: a
|
|
299
310
|
// recording that captured it too would hold every line twice.
|
|
@@ -313,10 +324,15 @@ export async function builtin_play(args) {
|
|
|
313
324
|
// The line is SHOWN as written, then handed to the session, which
|
|
314
325
|
// resolves its references the way it resolves every other line's.
|
|
315
326
|
sink_dataLine(chalk.cyan(`▸ ${line.text}`));
|
|
327
|
+
// A line failed when it refused or set the exit status. The status is
|
|
328
|
+
// cleared before each line, so one an earlier command left set (before
|
|
329
|
+
// the play, or by a line that passed) is never this line's.
|
|
330
|
+
process.exitCode = 0;
|
|
316
331
|
const envelopes = await line_execute(line.text);
|
|
317
332
|
ran += 1;
|
|
318
|
-
const refused = envelopes.some((envelope) => envelope.status === 'error')
|
|
319
|
-
|
|
333
|
+
const refused = envelopes.some((envelope) => envelope.status === 'error')
|
|
334
|
+
|| exitCode_read() !== 0;
|
|
335
|
+
if (refused) {
|
|
320
336
|
// A workflow whose first half failed has a second half that is
|
|
321
337
|
// noise: the play stops where the trouble is.
|
|
322
338
|
sink_errLine(chalk.red(`✗ ${parsed.manifest}:${line.number} refused — stopping.`));
|
|
@@ -337,6 +353,9 @@ export async function builtin_play(args) {
|
|
|
337
353
|
recorder_unmute();
|
|
338
354
|
depth -= 1;
|
|
339
355
|
}
|
|
356
|
+
// A play that ran through leaves the session's status as it found it.
|
|
357
|
+
if (stoppedAt === null)
|
|
358
|
+
process.exitCode = exitBeforePlay;
|
|
340
359
|
const outcome = {
|
|
341
360
|
manifest: parsed.manifest,
|
|
342
361
|
ran,
|