@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.
Files changed (153) hide show
  1. package/dist/buildinfo.json +1 -0
  2. package/dist/builtins/argumentTokens.d.ts +18 -0
  3. package/dist/builtins/argumentTokens.js +58 -0
  4. package/dist/builtins/argumentTokens.js.map +1 -0
  5. package/dist/builtins/executable.d.ts +3 -7
  6. package/dist/builtins/executable.js +32 -29
  7. package/dist/builtins/executable.js.map +1 -1
  8. package/dist/builtins/feedCreation.d.ts +23 -0
  9. package/dist/builtins/feedCreation.js +45 -0
  10. package/dist/builtins/feedCreation.js.map +1 -0
  11. package/dist/builtins/fs/cat.args.d.ts +36 -0
  12. package/dist/builtins/fs/cat.args.js +63 -0
  13. package/dist/builtins/fs/cat.args.js.map +1 -0
  14. package/dist/builtins/fs/cat.d.ts +2 -2
  15. package/dist/builtins/fs/cat.js +222 -101
  16. package/dist/builtins/fs/cat.js.map +1 -1
  17. package/dist/builtins/fs/cd.js +41 -5
  18. package/dist/builtins/fs/cd.js.map +1 -1
  19. package/dist/builtins/fs/cp.js +3 -2
  20. package/dist/builtins/fs/cp.js.map +1 -1
  21. package/dist/builtins/fs/download.d.ts +1 -1
  22. package/dist/builtins/fs/download.js +52 -13
  23. package/dist/builtins/fs/download.js.map +1 -1
  24. package/dist/builtins/fs/du.js +15 -1
  25. package/dist/builtins/fs/du.js.map +1 -1
  26. package/dist/builtins/fs/ls.js +10 -1
  27. package/dist/builtins/fs/ls.js.map +1 -1
  28. package/dist/builtins/fs/mv.js +7 -3
  29. package/dist/builtins/fs/mv.js.map +1 -1
  30. package/dist/builtins/fs/pull.args.d.ts +14 -1
  31. package/dist/builtins/fs/pull.args.js +72 -9
  32. package/dist/builtins/fs/pull.args.js.map +1 -1
  33. package/dist/builtins/fs/pull.d.ts +1 -0
  34. package/dist/builtins/fs/pull.js +191 -259
  35. package/dist/builtins/fs/pull.js.map +1 -1
  36. package/dist/builtins/fs/rm.js +4 -0
  37. package/dist/builtins/fs/rm.js.map +1 -1
  38. package/dist/builtins/fs/tree.js +7 -3
  39. package/dist/builtins/fs/tree.js.map +1 -1
  40. package/dist/builtins/fs/upload.js +29 -2
  41. package/dist/builtins/fs/upload.js.map +1 -1
  42. package/dist/builtins/help.d.ts +7 -0
  43. package/dist/builtins/help.js +144 -36
  44. package/dist/builtins/help.js.map +1 -1
  45. package/dist/builtins/index.d.ts +1 -0
  46. package/dist/builtins/index.js +1 -0
  47. package/dist/builtins/index.js.map +1 -1
  48. package/dist/builtins/net/pacs.d.ts +1 -0
  49. package/dist/builtins/net/pacs.js +5 -1
  50. package/dist/builtins/net/pacs.js.map +1 -1
  51. package/dist/builtins/net/pacsUtils.d.ts +5 -4
  52. package/dist/builtins/net/pacsUtils.js +12 -32
  53. package/dist/builtins/net/pacsUtils.js.map +1 -1
  54. package/dist/builtins/net/query.js +4 -1
  55. package/dist/builtins/net/query.js.map +1 -1
  56. package/dist/builtins/net/status.d.ts +14 -0
  57. package/dist/builtins/net/status.js +210 -0
  58. package/dist/builtins/net/status.js.map +1 -0
  59. package/dist/builtins/pluginExecute.d.ts +3 -2
  60. package/dist/builtins/pluginExecute.js +41 -70
  61. package/dist/builtins/pluginExecute.js.map +1 -1
  62. package/dist/builtins/pluginSelector.d.ts +15 -0
  63. package/dist/builtins/pluginSelector.js +21 -0
  64. package/dist/builtins/pluginSelector.js.map +1 -0
  65. package/dist/builtins/proc.js +106 -4
  66. package/dist/builtins/proc.js.map +1 -1
  67. package/dist/builtins/res/compute.js +8 -3
  68. package/dist/builtins/res/compute.js.map +1 -1
  69. package/dist/builtins/res/group.d.ts +1 -1
  70. package/dist/builtins/res/group.js +122 -5
  71. package/dist/builtins/res/group.js.map +1 -1
  72. package/dist/builtins/res/pipeline.args.d.ts +4 -0
  73. package/dist/builtins/res/pipeline.args.js +63 -12
  74. package/dist/builtins/res/pipeline.args.js.map +1 -1
  75. package/dist/builtins/res/pipeline.d.ts +3 -1
  76. package/dist/builtins/res/pipeline.js +155 -60
  77. package/dist/builtins/res/pipeline.js.map +1 -1
  78. package/dist/builtins/res/pipeline.manifest.d.ts +15 -0
  79. package/dist/builtins/res/pipeline.manifest.js +93 -0
  80. package/dist/builtins/res/pipeline.manifest.js.map +1 -0
  81. package/dist/builtins/res/plugin.js +14 -7
  82. package/dist/builtins/res/plugin.js.map +1 -1
  83. package/dist/builtins/res/user.d.ts +8 -0
  84. package/dist/builtins/res/user.js +87 -0
  85. package/dist/builtins/res/user.js.map +1 -0
  86. package/dist/builtins/store.js +24 -3
  87. package/dist/builtins/store.js.map +1 -1
  88. package/dist/builtins/sys/fortune.d.ts +9 -0
  89. package/dist/builtins/sys/fortune.js +16 -1
  90. package/dist/builtins/sys/fortune.js.map +1 -1
  91. package/dist/builtins/sys/whoami.d.ts +13 -1
  92. package/dist/builtins/sys/whoami.js +47 -2
  93. package/dist/builtins/sys/whoami.js.map +1 -1
  94. package/dist/builtins/utils.d.ts +14 -1
  95. package/dist/builtins/utils.js +13 -3
  96. package/dist/builtins/utils.js.map +1 -1
  97. package/dist/builtins/wildcard.d.ts +31 -0
  98. package/dist/builtins/wildcard.js +112 -50
  99. package/dist/builtins/wildcard.js.map +1 -1
  100. package/dist/command-keys.js +2 -1
  101. package/dist/command-keys.js.map +1 -1
  102. package/dist/core/cancellation.d.ts +28 -0
  103. package/dist/core/cancellation.js +70 -0
  104. package/dist/core/cancellation.js.map +1 -0
  105. package/dist/core/dispatch.d.ts +1 -8
  106. package/dist/core/dispatch.js +82 -82
  107. package/dist/core/dispatch.js.map +1 -1
  108. package/dist/core/elevation.d.ts +35 -0
  109. package/dist/core/elevation.js +77 -0
  110. package/dist/core/elevation.js.map +1 -0
  111. package/dist/core/engine.d.ts +12 -0
  112. package/dist/core/engine.js +35 -8
  113. package/dist/core/engine.js.map +1 -1
  114. package/dist/core/preprocess.d.ts +11 -4
  115. package/dist/core/preprocess.js +43 -10
  116. package/dist/core/preprocess.js.map +1 -1
  117. package/dist/core/progress.d.ts +15 -5
  118. package/dist/core/progress.js +14 -0
  119. package/dist/core/progress.js.map +1 -1
  120. package/dist/core/promptContext.d.ts +3 -5
  121. package/dist/core/promptContext.js +9 -2
  122. package/dist/core/promptContext.js.map +1 -1
  123. package/dist/core/sink.d.ts +9 -0
  124. package/dist/core/sink.js +23 -3
  125. package/dist/core/sink.js.map +1 -1
  126. package/dist/core/surface.d.ts +14 -0
  127. package/dist/core/surface.js +5 -0
  128. package/dist/core/surface.js.map +1 -1
  129. package/dist/core/version.d.ts +34 -0
  130. package/dist/core/version.js +51 -0
  131. package/dist/core/version.js.map +1 -1
  132. package/dist/index.d.ts +1 -0
  133. package/dist/index.js +1 -0
  134. package/dist/index.js.map +1 -1
  135. package/dist/lib/completer/index.js +39 -1
  136. package/dist/lib/completer/index.js.map +1 -1
  137. package/dist/lib/parser.d.ts +75 -2
  138. package/dist/lib/parser.js +158 -15
  139. package/dist/lib/parser.js.map +1 -1
  140. package/dist/lib/vfs/providers/binEntry.d.ts +20 -0
  141. package/dist/lib/vfs/providers/binEntry.js +47 -0
  142. package/dist/lib/vfs/providers/binEntry.js.map +1 -0
  143. package/dist/lib/vfs/providers/static.js +1 -0
  144. package/dist/lib/vfs/providers/static.js.map +1 -1
  145. package/dist/lib/vfs/providers/static_content.js +5 -36
  146. package/dist/lib/vfs/providers/static_content.js.map +1 -1
  147. package/dist/lib/vfs/vfs.d.ts +7 -0
  148. package/dist/lib/vfs/vfs.js +25 -0
  149. package/dist/lib/vfs/vfs.js.map +1 -1
  150. package/dist/session/index.d.ts +18 -0
  151. package/dist/session/index.js +29 -1
  152. package/dist/session/index.js.map +1 -1
  153. 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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAK3B,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,uDAAuD;AACvD,MAAM,SAAS,GAAW,EAAE,CAAC;AAE7B;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,MAAc,EAAE,QAAgB;IAClD,MAAM,WAAW,GAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAW,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3F,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,MAAsC,EAAE,IAAY;IAC/E,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,yBAAyB,CAAC,OAA+B;IACtE,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,OAAO,GAAyB,UAAU,CAAC,KAAK,CAAC;IACvD,MAAM,IAAI,GAA8B,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAEhE,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAY,GAAG,CAAC,KAAK,CAAC;QACpC,MAAM,EAAE,GAAW,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAAE,SAAS;QACpE,IAAI,MAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA2B,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAa,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YACrC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,EAAE,GAAG,MAAM,CAAC;YAAE,MAAM,GAAG,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,oBAAoB,CACjC,MAAc,EACd,UAAkB;IAElB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAW,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,sCAAsC,MAAM,EAAE,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAkC,eAAe,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,mDAAmD,MAAM,EAAE,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAkB,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEhE,0EAA0E;IAC1E,sBAAsB;IACtB,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAC3C,MAAM,EACN,UAAU,MAAM,EAAE,EAClB,UAAU,EACV,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAC5C,CAAC;IACF,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,MAAM,EAAE,EAAE,CAAC;IAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,MAA6B;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAW,CAAC,CAAC;IAC5B,IAAI,WAAW,GAAW,CAAC,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,CAChC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,EACrG,CAAC,CACF,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClC,WAAW,EAAE,CAAC;YACd,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,WAAW,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAW,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9F,MAAM,GAAG,GAAW,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,MAAM,GAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,KAAK,GAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YACxF,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,WAAW,IAAI,WAAW,wBAAwB,CAAC,CAAC,CAAC;IAChF,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAc;IACrD,IAAI,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAuB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,+EAA+E,CAAC,IAAI,CAAC,CAAC;IAC1I,CAAC;IAED,MAAM,UAAU,GAAkB,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,IAAI,CAAC,CAAC;IACnI,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3E,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oCAAoC,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,wDAAwD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7H,CAAC;IAED,MAAM,MAAM,GAA0B,YAAY,CAAC,KAAK,CAAC;IACzD,MAAM,QAAQ,GAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,KAAK,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7F,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -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 Promise that resolves when execution completes.
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<void>;
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 { dictionary_fromCLI, errorStack, procCache_get } from '@fnndsc/cumin';
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
- * Parses a plugin name from /bin format (name-vVersion) into ChRIS search format.
16
- *
17
- * @param pluginName - Plugin name in format: pl-name-vX.Y.Z
18
- * @returns Search string in format: name_exact:pl-name,version:X.Y.Z
19
- *
20
- * @example
21
- * ```typescript
22
- * pluginName_toSearchString('pl-dcm2niix-v1.0.2')
23
- * // Returns: 'name_exact:pl-dcm2niix,version:1.0.2'
24
- * ```
25
- */
26
- function pluginName_toSearchString(pluginName) {
27
- // Pattern: (name)-v(version)
28
- const match = pluginName.match(/^(.+)-v(.+)$/);
29
- if (match) {
30
- const name = match[1];
31
- const version = match[2];
32
- return `name_exact:${name},version:${version}`;
33
- }
34
- // Fallback: if no version suffix, search by name only
35
- return `name_exact:${pluginName}`;
36
- }
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 Promise that resolves when execution completes.
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. Parse arguments - split on '--' delimiter
58
- const argsString = args.join(' ');
59
- let pluginArgsStr = argsString;
60
- let contextArgsStr = '';
61
- // Check for ' -- ' delimiter (space-dash-dash-space)
62
- const delimiterIndex = argsString.indexOf(' -- ');
63
- if (delimiterIndex !== -1) {
64
- pluginArgsStr = argsString.substring(0, delimiterIndex);
65
- contextArgsStr = argsString.substring(delimiterIndex + 4); // +4 to skip ' -- '
66
- }
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 (pluginArgsStr.trim()) {
45
+ if (pluginArgTokens.length > 0) {
71
46
  try {
72
- pluginParams = dictionary_fromCLI(pluginArgsStr);
47
+ pluginParams = executableArguments_parse(pluginArgTokens);
73
48
  }
74
49
  catch (e) {
75
50
  const msg = e instanceof Error ? e.message : String(e);
76
- console.error(chalk.red(`Error parsing plugin parameters: ${msg}`));
77
- return;
51
+ sink_errLine(chalk.red(`Error parsing plugin parameters: ${msg}`));
52
+ return envelope_error('');
78
53
  }
79
54
  }
80
- if (contextArgsStr.trim()) {
55
+ if (contextArgTokens.length > 0) {
81
56
  try {
82
- contextParams = dictionary_fromCLI(contextArgsStr);
57
+ contextParams = executableArguments_parse(contextArgTokens);
83
58
  }
84
59
  catch (e) {
85
60
  const msg = e instanceof Error ? e.message : String(e);
86
- console.error(chalk.red(`Error parsing context parameters: ${msg}`));
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 (!contextArgsStr && !isInFeed) {
69
+ if (contextArgTokens.length === 0 && !isInFeed) {
95
70
  const defaultTitle = cwd.split('/').pop() || 'Untitled';
96
71
  contextParams.feed_title = defaultTitle;
97
- console.log(chalk.cyan(`Using feed title: "${defaultTitle}" (customize with -- feed_title="Custom Title")`));
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
- console.error(chalk.red('Failed to access /bin directory'));
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 = pluginName_toSearchString(pluginName);
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
- console.error(chalk.red('Plugin execution failed:'));
88
+ sink_errLine(chalk.red('Plugin execution failed:'));
114
89
  let error = errorStack.stack_pop();
115
90
  while (error) {
116
- console.error(chalk.red(` - ${error.message}`));
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 = cwd.split('/').pop() || `feed_${result.feedID}`;
125
- procCache_get().feed_add({
126
- id: result.feedID, title: feedTitle,
127
- ownerUsername: cwd.split('/')[2] ?? '', public: false,
128
- creationDate: new Date().toISOString(),
129
- finishedJobs: 0, erroredJobs: 0, startedJobs: 0,
130
- scheduledJobs: 2, cancelledJobs: 0, createdJobs: 0,
131
- });
132
- procCache_get().instance_add({
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
- console.log(chalk.green(`Feed created: ${result.feedID}`));
125
+ sink_dataLine(chalk.green(`Feed created: ${result.feedID}`));
157
126
  }
158
- console.log(chalk.green(`Job scheduled: ${pluginName} (ID: ${result.pluginInstanceID})`));
159
- console.log(chalk.cyan(`Output will be in: ${result.outputPath}`));
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
- console.error(chalk.red(`Error executing plugin: ${msg}`));
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":"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"}
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"}