@fnndsc/chell 5.6.2 → 5.7.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.
@@ -9,10 +9,10 @@
9
9
  * @module
10
10
  */
11
11
  import { error_stripDebugPrefix, prefetch_path, prefetch_withSpinner, repl_question, session, vfs, warmupFailure_clear, warmupFailure_note, } from '@fnndsc/brasa';
12
- import { daemon_launch, face_ready, face_stop, identity_forSession, hostControl_fromInputs, hostControl_describe } from '@fnndsc/calypso';
13
- import { procIndex_snapshot } from '@fnndsc/brasa';
12
+ import { daemon_launch, identity_forSession, hostControl_fromInputs } from '@fnndsc/calypso';
13
+ import { daemonConsole_run } from './daemonConsole.js';
14
14
  import { logo_animateHalt } from '../lib/logo.js';
15
- import { sink_set, StdoutSink } from '@fnndsc/brasa';
15
+ import { sink_set, StdoutSink, count_noun } from '@fnndsc/brasa';
16
16
  import { TerminalProgressRenderer } from './progressRenderer.js';
17
17
  import { chrisContext, errorStack, procCache_get, procCheckpoint_restore, procCheckpoint_watch, listCache_get, listCheckpoint_restore, listCheckpoint_watch, queryIndexCheckpoint_restore, queryIndexCheckpoint_save, queryIndexCheckpoint_watch, queryIndex_sweep, } from '@fnndsc/cumin';
18
18
  import { procCache_refresh, procRoster_bootSync, procRoster_sync, procTopology_status, procTopology_warmup, vfsDispatcher, } from '@fnndsc/salsa';
@@ -47,13 +47,28 @@ async function startupRetry_wait(attempt) {
47
47
  * @returns The first successful result, or the last failed result.
48
48
  */
49
49
  async function startupPrefetch_retry(label, message, interactive, reporter, action) {
50
+ return startupAttempts_run(label, reporter, () => prefetch_withSpinner(label, message, interactive, action, BOOT_TAG_WIDTH));
51
+ }
52
+ /**
53
+ * Runs one warm-up attempt at a time under the bounded retry policy.
54
+ *
55
+ * Draws nothing itself: a blocking step wraps each attempt in the spinner
56
+ * (or its plain-log stand-in), and a deferred step has already printed its
57
+ * pending row and must not print another.
58
+ *
59
+ * @param label - Stable boot-step label.
60
+ * @param reporter - Where retry rows go, or null to retry silently.
61
+ * @param attempt - One attempt at the cache operation.
62
+ * @returns The first successful result, or the last failed result.
63
+ */
64
+ async function startupAttempts_run(label, reporter, attempt) {
50
65
  let last = { ok: false, message: 'Warm-up did not run.' };
51
- for (let attempt = 1; attempt <= STARTUP_WARMUP_ATTEMPTS; attempt++) {
52
- last = await prefetch_withSpinner(label, message, interactive, action, BOOT_TAG_WIDTH);
53
- if (last.ok || attempt === STARTUP_WARMUP_ATTEMPTS)
66
+ for (let turn = 1; turn <= STARTUP_WARMUP_ATTEMPTS; turn++) {
67
+ last = await attempt();
68
+ if (last.ok || turn === STARTUP_WARMUP_ATTEMPTS)
54
69
  return last;
55
- reporter?.log('retry', label, `Attempt ${attempt}/${STARTUP_WARMUP_ATTEMPTS} failed: ${last.message ?? 'unknown error'}; retrying.`);
56
- await startupRetry_wait(attempt);
70
+ reporter?.log('retry', label, `Attempt ${turn}/${STARTUP_WARMUP_ATTEMPTS} failed: ${last.message ?? 'unknown error'}; retrying.`);
71
+ await startupRetry_wait(turn);
57
72
  }
58
73
  return last;
59
74
  }
@@ -90,34 +105,43 @@ async function daemonWarmupFailure_decide(failures) {
90
105
  * A deferred step leaves the boot failure gate with this call, so its
91
106
  * failure is announced afterwards rather than holding the daemon.
92
107
  *
108
+ * The pending row is the only thing printed here. The attempts themselves
109
+ * run without the spinner helper: its plain-log stand-in printed the same
110
+ * label and message again, untagged, directly under the pending row.
111
+ *
93
112
  * @param label - Stable boot-step label.
94
113
  * @param message - What the row says while it runs.
95
114
  * @param reporter - Host status logger, or null.
115
+ * @param settlement - Whether the readout persists to take the outcome
116
+ * row: the daemon face keeps its boot log, so `[ OK ]` and `[FAIL]`
117
+ * land there when the step settles; an interactive readout has scrolled
118
+ * away, and the prompt carries a failure instead.
96
119
  * @param action - The warm-up itself.
120
+ * @param describe - Words for a successful outcome's row.
97
121
  * @returns The step's label and the promise of its outcome.
98
122
  */
99
- function warmup_defer(label, message, reporter, action) {
123
+ function warmup_defer(label, message, reporter, settlement, action, describe) {
100
124
  reporter?.log('pending', label, message);
101
- // Nothing reports a deferred completion: a warm that finishes and
102
- // changes nothing is not news. Only a failure is, and that is
103
- // annunciated rather than printed to a readout already scrolled past.
125
+ const outcomes = settlement ? reporter : null;
104
126
  // A deferred step keeps the bounded retry policy a blocking one had: a
105
- // transient failure should be retried before it is announced. The retry
106
- // rows go nowhere, though — the readout they would print to is already
107
- // scrolled past.
108
- const settled = startupPrefetch_retry(label, message, false, null, action)
127
+ // transient failure should be retried before it is announced.
128
+ const settled = startupAttempts_run(label, outcomes, action)
109
129
  .catch((error) => ({
110
130
  ok: false,
111
131
  message: error instanceof Error ? error.message : String(error),
112
132
  }))
113
133
  .then((outcome) => {
114
- // Held until a later attempt succeeds. The readout it would have
115
- // been printed to has scrolled away by now, so the prompt and the
116
- // status strip carry it instead.
117
- if (outcome.ok)
134
+ // A failure is held until a later attempt succeeds, so a surface
135
+ // whose readout has scrolled away still announces it at the prompt.
136
+ if (outcome.ok) {
118
137
  warmupFailure_clear(label);
119
- else
120
- warmupFailure_note(label, outcome.message ?? `${label} warm-up failed`);
138
+ outcomes?.log('ok', label, describe(outcome));
139
+ }
140
+ else {
141
+ const failure = outcome.message ?? `${label} warm-up failed`;
142
+ warmupFailure_note(label, failure);
143
+ outcomes?.log('fail', label, failure);
144
+ }
121
145
  return outcome;
122
146
  });
123
147
  return { label, settled };
@@ -143,8 +167,8 @@ function restoreAge_describe() {
143
167
  return `, oldest ${minutes} min`;
144
168
  const hours = Math.floor(minutes / 60);
145
169
  if (hours < 48)
146
- return `, oldest ${hours} hour(s)`;
147
- return `, oldest ${Math.floor(hours / 24)} day(s)`;
170
+ return `, oldest ${count_noun(hours, 'hour')}`;
171
+ return `, oldest ${count_noun(Math.floor(hours / 24), 'day')}`;
148
172
  }
149
173
  /**
150
174
  * The identity whose checkpoints this process may write, once a boot has
@@ -200,11 +224,13 @@ export async function queryCheckpoint_flush() {
200
224
  * @param user - Authenticated username used to construct the feed path.
201
225
  * @param interactive - Whether progress may use an interactive spinner.
202
226
  * @param reporter - Host status logger, or null for silent status reporting.
203
- * @param reportTopologySettlement - Whether to report the asynchronous topology
204
- * result; daemon hosts enable this, while interactive hosts use prompt progress.
227
+ * @param reportSettlement - Whether to report outcomes that arrive after
228
+ * boot (the topology walk, the steps warming behind the prompt); daemon
229
+ * hosts enable this because the face keeps the readout, while interactive
230
+ * hosts use prompt progress.
205
231
  * @returns Cache counts and the labels of any failed warm-up operations.
206
232
  */
207
- export async function startupWarmup_run(flags, user, interactive, reporter, reportTopologySettlement = false) {
233
+ export async function startupWarmup_run(flags, user, interactive, reporter, reportSettlement = false) {
208
234
  const result = { failures: [], deferred: [] };
209
235
  /** The identity whose checkpoints this boot restored, once known. */
210
236
  let checkpointIdentity = null;
@@ -232,7 +258,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
232
258
  const listings = await listCheckpoint_restore(identity);
233
259
  listCheckpoint_watch(identity);
234
260
  reporter?.log(listings.restored ? 'ok' : 'skip', 'Folders', listings.restored
235
- ? `Restored ${listings.count} folder listing(s)${restoreAge_describe()}, stale until revisited`
261
+ ? `Restored ${count_noun(listings.count, 'folder listing')}${restoreAge_describe()}, stale until revisited`
236
262
  : (listings.reason ?? 'No folder-listing checkpoint'));
237
263
  // What has already been asked of a PACS. Expensive to build — every
238
264
  // row of the collection drags its compressed result — and cheap to
@@ -240,7 +266,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
240
266
  const queries = await queryIndexCheckpoint_restore(identity);
241
267
  queryIndexCheckpoint_watch(identity);
242
268
  reporter?.log(queries.restored ? 'ok' : 'skip', 'Queries', queries.restored
243
- ? `Restored ${queries.count} PACS quer(y/ies) already asked`
269
+ ? `Restored ${count_noun(queries.count, 'PACS query', 'PACS queries')} already asked`
244
270
  : (queries.reason ?? 'No PACS query index'));
245
271
  }
246
272
  }
@@ -260,8 +286,8 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
260
286
  if (pluginsResult.ok) {
261
287
  result.plugins = pluginsResult.count;
262
288
  result.pipelines = pluginsResult.pipelineCount;
263
- reporter?.log('ok', 'Plugins', `Cached ${pluginsResult.count ?? 0} plugin(s)`);
264
- reporter?.log('ok', 'Pipelines', `Cached ${pluginsResult.pipelineCount ?? 0} pipeline(s)`);
289
+ reporter?.log('ok', 'Plugins', `Cached ${count_noun(pluginsResult.count ?? 0, 'plugin')}`);
290
+ reporter?.log('ok', 'Pipelines', `Cached ${count_noun(pluginsResult.pipelineCount ?? 0, 'pipeline')}`);
265
291
  }
266
292
  else {
267
293
  result.failures.push('Plugins');
@@ -277,7 +303,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
277
303
  reporter?.log('skip', 'Pipelines', 'Offline mode');
278
304
  }
279
305
  if (!session.offline) {
280
- result.deferred.push(warmup_defer('Groups', 'Resolving /etc/group behind the prompt', reporter, async () => {
306
+ result.deferred.push(warmup_defer('Groups', 'Resolving /etc/group behind the prompt', reporter, reportSettlement, async () => {
281
307
  const projection = await vfsDispatcher.read('/etc/group');
282
308
  if (projection.ok) {
283
309
  const count = projection.value.split('\n').filter(Boolean).length;
@@ -285,7 +311,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
285
311
  }
286
312
  const error = errorStack.stack_pop();
287
313
  return { ok: false, message: error?.message ?? 'Failed to resolve /etc/group' };
288
- }));
314
+ }, (outcome) => `Cached ${count_noun(outcome.count ?? 0, 'group')}`));
289
315
  }
290
316
  else {
291
317
  reporter?.log('skip', 'Groups', 'Offline mode');
@@ -293,22 +319,22 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
293
319
  if (!session.offline && flags.feeds) {
294
320
  const feedPath = user ? `/home/${user}/feeds` : undefined;
295
321
  if (feedPath) {
296
- result.deferred.push(warmup_defer('Feeds', `Warming ${feedPath} behind the prompt`, reporter, () => prefetch_path(feedPath)));
322
+ result.deferred.push(warmup_defer('Feeds', `Warming ${feedPath} behind the prompt`, reporter, reportSettlement, () => prefetch_path(feedPath), (outcome) => `Cached ${count_noun(outcome.count ?? 0, 'item')} from ${feedPath}`));
297
323
  }
298
324
  else {
299
325
  reporter?.log('skip', 'Feeds', 'No user context');
300
326
  }
301
327
  if (flags.publicFeeds) {
302
- result.deferred.push(warmup_defer('Public', 'Warming /PUBLIC behind the prompt', reporter, () => prefetch_path('/PUBLIC')));
328
+ result.deferred.push(warmup_defer('Public', 'Warming /PUBLIC behind the prompt', reporter, reportSettlement, () => prefetch_path('/PUBLIC'), (outcome) => `Cached ${count_noun(outcome.count ?? 0, 'item')} from /PUBLIC`));
303
329
  }
304
330
  // `/SHARED` is where another identity's work becomes visible, and it
305
331
  // had no step at all: nothing to fail, so a CUBE that stopped serving
306
332
  // shared paths stayed silent until somebody went looking.
307
- result.deferred.push(warmup_defer('Shared', 'Warming /SHARED behind the prompt', reporter, () => prefetch_path('/SHARED')));
333
+ result.deferred.push(warmup_defer('Shared', 'Warming /SHARED behind the prompt', reporter, reportSettlement, () => prefetch_path('/SHARED'), (outcome) => `Cached ${count_noun(outcome.count ?? 0, 'item')} from /SHARED`));
308
334
  // The PACS query back catalogue. It resumes from the index's floor, so
309
335
  // a restored index walks only what arrived since — and a cold one pays
310
336
  // the whole walk once, behind the prompt, never in front of a query.
311
- result.deferred.push(warmup_defer('Queries', 'Indexing prior PACS queries behind the prompt', reporter, async () => {
337
+ result.deferred.push(warmup_defer('Queries', 'Indexing prior PACS queries behind the prompt', reporter, reportSettlement, async () => {
312
338
  // Every identity's queries, not just this one's: the index is also
313
339
  // the log that `/net/pacs/queries` lists, and that log has always
314
340
  // shown whatever CUBE holds. A replay stays scoped to the asking
@@ -321,7 +347,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
321
347
  if (swept.value.bounded) {
322
348
  return {
323
349
  ok: false,
324
- message: `Indexed ${swept.value.indexed} PACS quer(y/ies) and stopped at the page bound — the index is incomplete`,
350
+ message: `${count_noun(swept.value.total, 'PACS query', 'PACS queries')} indexed, stopped at the page bound — the index is incomplete`,
325
351
  };
326
352
  }
327
353
  // Made durable here rather than left to the debounced writer: that
@@ -335,9 +361,16 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
335
361
  }
336
362
  return {
337
363
  ok: true,
338
- count: swept.value.indexed,
339
- ...(swept.value.resumed ? { message: 'resumed from the restored index' } : {}),
364
+ count: swept.value.total,
365
+ pipelineCount: swept.value.indexed,
340
366
  };
367
+ },
368
+ // The amount of queries the index holds, and how many this top-up added
369
+ // — a resume that found nothing new says just the total, not "1".
370
+ (outcome) => {
371
+ const total = outcome.count ?? 0;
372
+ const fresh = outcome.pipelineCount ?? 0;
373
+ return `${count_noun(total, 'PACS query', 'PACS queries')} indexed${fresh > 0 ? `, ${fresh} new` : ''}`;
341
374
  }));
342
375
  }
343
376
  else if (!session.offline) {
@@ -349,7 +382,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
349
382
  if (!session.offline && flags.jobs) {
350
383
  let checkpoint = null;
351
384
  let rosterAdded = [];
352
- if (reportTopologySettlement && user) {
385
+ if (reportSettlement && user) {
353
386
  const cubeUrl = await chrisContext.ChRISURL_get();
354
387
  if (cubeUrl) {
355
388
  const identity = identity_forSession(user, cubeUrl);
@@ -380,8 +413,8 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
380
413
  });
381
414
  if (jobsResult.ok) {
382
415
  const jobsMessage = checkpoint?.restored
383
- ? `Restored ${checkpoint.count} job(s)${checkpoint.migrated ? ' (checkpoint migrated to per-feed shards)' : ''}; ${jobsResult.count ?? 0} feed(s), ${rosterAdded.length} new — full roster refresh in background`
384
- : `Indexed ${jobsResult.count ?? 0} feed(s) — topology reconciling in background`;
416
+ ? `Restored ${count_noun(checkpoint.count, 'job')}${checkpoint.migrated ? ' (checkpoint migrated to per-feed shards)' : ''}; ${count_noun(jobsResult.count ?? 0, 'feed')}, ${rosterAdded.length} new — full roster refresh in background`
417
+ : `Indexed ${count_noun(jobsResult.count ?? 0, 'feed')} — topology reconciling in background`;
385
418
  reporter?.log('ok', 'Jobs', jobsMessage);
386
419
  errorStack.scope_run(() => {
387
420
  let topologySweep;
@@ -392,14 +425,14 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
392
425
  procCache_get().warmup_complete();
393
426
  topologySweep = procRoster_sync(true).then((changed) => {
394
427
  if (changed.length > 0) {
395
- reporter?.log('ok', 'Roster', `${changed.length} feed(s) moved while away; each refreshes on its next visit`);
428
+ reporter?.log('ok', 'Roster', `${count_noun(changed.length, 'feed')} moved while away; each refreshes on its next visit`);
396
429
  }
397
430
  });
398
431
  }
399
432
  else {
400
433
  topologySweep = procTopology_warmup();
401
434
  }
402
- if (reportTopologySettlement) {
435
+ if (reportSettlement) {
403
436
  void topologySweep.then(() => {
404
437
  const topology = procTopology_status();
405
438
  if (topology.state !== 'complete') {
@@ -408,7 +441,7 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
408
441
  }
409
442
  const progress = procCache_get().warmupProgress_get();
410
443
  const total = progress.total > 0 ? progress.total : progress.loaded;
411
- reporter?.log('ok', 'Topology', `Ready — ${progress.loaded}/${total} job(s) indexed`);
444
+ reporter?.log('ok', 'Topology', `Ready — ${progress.loaded}/${count_noun(total, 'job')} indexed`);
412
445
  }, (error) => {
413
446
  const message = error instanceof Error ? error.message : String(error);
414
447
  reporter?.log('fail', 'Topology', `Warm-up failed: ${message}`);
@@ -440,8 +473,12 @@ export async function startupWarmup_run(flags, user, interactive, reporter, repo
440
473
  * @param flags - Resource caches selected by daemon boot flags.
441
474
  * @param interactive - Whether progress may use an interactive spinner.
442
475
  * @param reporter - Daemon boot status logger.
476
+ * @param recovery - Asks the operator what to do after an exhausted warm-up.
477
+ * @param hostControlInputs - The host-control policy inputs.
478
+ * @param console - Puts a surface on this terminal once the daemon is up;
479
+ * the daemon console by default, replaceable under test.
443
480
  */
444
- export async function daemonSession_run(engine, user, flags, interactive, reporter, recovery = daemonWarmupFailure_decide, hostControlInputs = {}) {
481
+ export async function daemonSession_run(engine, user, flags, interactive, reporter, recovery = daemonWarmupFailure_decide, hostControlInputs = {}, console = daemonConsole_run) {
445
482
  try {
446
483
  // Warm-up runs before the daemon installs its own sink, so the engine is
447
484
  // still writing to this terminal — and a daemon boot is the one time
@@ -457,6 +494,15 @@ export async function daemonSession_run(engine, user, flags, interactive, report
457
494
  }
458
495
  const info = await daemon_launch(engine, async () => {
459
496
  const cache = await startupWarmup_run(flags, user, interactive, reporter, true);
497
+ // The steps warming behind the prompt settle on the readout before the
498
+ // login takes the terminal. They ran in parallel with the blocking
499
+ // warm-up; the boot now waits out whatever has not yet landed, so every
500
+ // row the operator is left looking at reads [ OK ] or [FAIL], never an
501
+ // open [PENDING] the console would cage before it could finish. The
502
+ // wait is bounded — each step carries its own retry budget — and the
503
+ // daemon is moments from listening, so nothing reaches it any sooner
504
+ // for the wait.
505
+ await Promise.allSettled(cache.deferred.map((step) => step.settled));
460
506
  if (cache.failures.length === 0) {
461
507
  reporter.log('ok', 'Engine', 'Ready');
462
508
  return;
@@ -468,40 +514,16 @@ export async function daemonSession_run(engine, user, flags, interactive, report
468
514
  reporter.log('fail', 'Engine', `Starting with incomplete warm-up: ${cache.failures.join(', ')}`);
469
515
  }, { hostControl: parsedPolicy.policy });
470
516
  if (interactive) {
471
- // Boot is over. The in-scroll pulse halts without a final repaint —
472
- // the text record (addresses included) stays verbatim for the face's
473
- // Esc view — and the alternate screen takes over as the resting
474
- // state: the animating brain and one status line, nothing else.
517
+ // Boot is over. The pulse halts without a final repaint — its row
518
+ // arithmetic drifts over the addresses just printed — and the boot
519
+ // ends the way a boot should: at a login. The identity is already
520
+ // resolved, so the login is the attach, and this terminal becomes
521
+ // the daemon's first surface.
475
522
  logo_animateHalt();
476
- const faceInfo = [
477
- { label: 'identity', value: info.identity },
478
- { label: 'wire', value: info.url },
479
- ...(info.argusUrl !== null ? [{ label: 'ARGUS', value: info.argusUrl }] : []),
480
- { label: 'token', value: info.token },
481
- { label: 'berth', value: info.berthPath },
482
- { label: 'attach', value: `chell --remote --attach ${info.url} --token ${info.token}` },
483
- ];
484
- face_ready({
485
- info: faceInfo,
486
- ...(info.hostControl.tiers.size > 0
487
- ? { hostControl: { tiers: hostControl_describe(info.hostControl), ...(info.hostControl.exposed && info.bindHost !== '127.0.0.1' ? { exposedOn: info.bindHost } : {}) } }
488
- : {}),
489
- telemetry_get: () => {
490
- const index = procIndex_snapshot();
491
- return {
492
- sessions: info.daemon.surfaces_count(),
493
- busy: info.daemon.busy_get(),
494
- jobs: index.jobs,
495
- feeds: index.feeds,
496
- };
497
- },
498
- });
523
+ await console({ identity: info.identity, url: info.url, token: info.token });
499
524
  }
500
525
  }
501
526
  catch (error) {
502
- // A boot dying with the face up must hand the terminal back — and flush
503
- // whatever the ring caged, the abort reason included.
504
- face_stop();
505
527
  if (error instanceof DaemonWarmupAbortedError) {
506
528
  process.exitCode = 1;
507
529
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"startupWarmup.js","sourceRoot":"","sources":["../../src/core/startupWarmup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"startupWarmup.js","sourceRoot":"","sources":["../../src/core/startupWarmup.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { type RowStream } from './terminalRows.js';
6
7
  /**
7
8
  * A single labeled boot-info line.
8
9
  */
@@ -41,14 +42,38 @@ export type BootStatus = 'ok' | 'retry' | 'skip' | 'fail' | 'pending';
41
42
  * right of every other row's.
42
43
  */
43
44
  export declare const BOOT_TAG_WIDTH: number;
45
+ /** What the boot readout needs of its terminal. */
46
+ export interface BootTerminal extends RowStream {
47
+ isTTY?: boolean;
48
+ rows?: number;
49
+ }
50
+ /** Where the readout draws, and which other streams scroll the same screen. */
51
+ export interface BootLoggerOptions {
52
+ /** The readout's own stream; `process.stdout` by default. */
53
+ terminal?: BootTerminal;
54
+ /**
55
+ * Streams that share the terminal's screen without being the readout's
56
+ * own — `process.stderr` by default — so what they scroll is counted too.
57
+ */
58
+ shared?: RowStream[];
59
+ }
44
60
  /**
45
61
  * Creates a boot logger that renders a titled status box.
46
62
  *
63
+ * On a terminal, a step that starts as `[PENDING]` (or falls to `[RETRY]`)
64
+ * is rewritten in place when its outcome lands, the way a boot screen
65
+ * settles a row rather than repeating it beneath. Every write to the screen
66
+ * is counted between the two moments, so the rewrite reaches the right row
67
+ * however much scrolled meanwhile — and gives up, appending instead, when
68
+ * the row has left the screen or the outcome needs more rows than it had.
69
+ * Off a terminal rows only append.
70
+ *
47
71
  * @param title - Box title.
48
72
  * @param useAscii - Use ASCII (vs unicode) box characters.
73
+ * @param options - The terminal to draw on; the process's own by default.
49
74
  * @returns A boot logger exposing status-logging helpers.
50
75
  */
51
- export declare function bootLogger_create(title: string, useAscii: boolean): {
76
+ export declare function bootLogger_create(title: string, useAscii: boolean, options?: BootLoggerOptions): {
52
77
  header_print(): void;
53
78
  footer_print(): void;
54
79
  log(status: BootStatus, label: string, message: string): void;
@@ -4,6 +4,7 @@
4
4
  * @module
5
5
  */
6
6
  import chalk from 'chalk';
7
+ import { streamRows_track, stdoutRows_ensure, stdoutRows_current } from './terminalRows.js';
7
8
  function text_visibleLength(text) {
8
9
  // Strip all ANSI escape sequences robustly to calculate correct visible width
9
10
  return text.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '').length;
@@ -33,11 +34,39 @@ export const BOOT_TAG_WIDTH = Math.max(...Object.values(BOOT_STATUS_TAGS).map((t
33
34
  /**
34
35
  * Creates a boot logger that renders a titled status box.
35
36
  *
37
+ * On a terminal, a step that starts as `[PENDING]` (or falls to `[RETRY]`)
38
+ * is rewritten in place when its outcome lands, the way a boot screen
39
+ * settles a row rather than repeating it beneath. Every write to the screen
40
+ * is counted between the two moments, so the rewrite reaches the right row
41
+ * however much scrolled meanwhile — and gives up, appending instead, when
42
+ * the row has left the screen or the outcome needs more rows than it had.
43
+ * Off a terminal rows only append.
44
+ *
36
45
  * @param title - Box title.
37
46
  * @param useAscii - Use ASCII (vs unicode) box characters.
47
+ * @param options - The terminal to draw on; the process's own by default.
38
48
  * @returns A boot logger exposing status-logging helpers.
39
49
  */
40
- export function bootLogger_create(title, useAscii) {
50
+ export function bootLogger_create(title, useAscii, options = {}) {
51
+ const terminal = options.terminal ?? process.stdout;
52
+ const ownsStdout = terminal === process.stdout;
53
+ // On the real terminal the boot readout shares one row tracker with the
54
+ // brain animation, so neither hooks stdout's write twice nor miscounts the
55
+ // other's scrolling. An injected test terminal gets its own local tracker.
56
+ const localTracked = terminal.isTTY === true && !ownsStdout ? streamRows_track(terminal) : null;
57
+ if (localTracked !== null) {
58
+ for (const stream of options.shared ?? [])
59
+ streamRows_track(stream, localTracked.counter);
60
+ }
61
+ const rows_tracked = () => {
62
+ if (terminal.isTTY !== true)
63
+ return null;
64
+ if (!ownsStdout)
65
+ return localTracked;
66
+ // Whatever the animation installed; failing that, install it here.
67
+ return stdoutRows_current() ?? stdoutRows_ensure();
68
+ };
69
+ const open = new Map();
41
70
  const horiz = useAscii ? '-' : '─';
42
71
  const cornerTL = useAscii ? '+' : '┌';
43
72
  const cornerTR = useAscii ? '+' : '┐';
@@ -54,12 +83,62 @@ export function bootLogger_create(title, useAscii) {
54
83
  // bytes the colour cost.
55
84
  return paint(text.padEnd(BOOT_TAG_WIDTH));
56
85
  };
86
+ /**
87
+ * Rewrites an open row where it stands.
88
+ *
89
+ * @param row - The settled row, painted.
90
+ * @param target - Where the open row was printed and how many rows it took.
91
+ * @returns False when the row cannot be reached or the outcome does not fit.
92
+ */
93
+ const row_rewrite = (row, target, tracked) => {
94
+ const up = tracked.counter.rows_get() - target.at;
95
+ // A terminal that reports no height (a pty that never sent its size)
96
+ // reads as zero, not absent, so default on any non-positive height —
97
+ // never `?? 24`, which a real zero slips straight through.
98
+ const screenRows = terminal.rows && terminal.rows > 0 ? terminal.rows : 24;
99
+ if (up <= 0 || up >= screenRows)
100
+ return false;
101
+ const needed = Math.max(1, Math.ceil(text_visibleLength(row) / (terminal.columns || 80)));
102
+ if (needed > target.rows)
103
+ return false;
104
+ // One write: save the cursor, climb to the row, clear every row it took,
105
+ // paint the outcome from its first row, and return — so a spinner
106
+ // mid-row below is left exactly where it was.
107
+ let text = `\x1b[s\x1b[${up}A`;
108
+ for (let index = 0; index < target.rows; index++) {
109
+ text += `\r\x1b[2K${index < target.rows - 1 ? '\x1b[1B' : ''}`;
110
+ }
111
+ if (target.rows > 1)
112
+ text += `\x1b[${target.rows - 1}A`;
113
+ text += `\r${row}\x1b[u`;
114
+ tracked.write_raw(text);
115
+ return true;
116
+ };
57
117
  return {
58
- header_print() { console.log(lineTop); },
59
- footer_print() { console.log(lineBot); },
118
+ header_print() { terminal.write(`${lineTop}\n`); },
119
+ footer_print() { terminal.write(`${lineBot}\n`); },
60
120
  log(status, label, message) {
61
- console.log(`${statusTag(status)} ${statusPad(label)} ${message}`);
62
- }
121
+ const row = `${statusTag(status)} ${statusPad(label)} ${message}`;
122
+ const stillOpen = status === 'pending' || status === 'retry';
123
+ const tracked = rows_tracked();
124
+ const target = open.get(label);
125
+ if (target !== undefined && tracked !== null && row_rewrite(row, target, tracked)) {
126
+ if (!stillOpen)
127
+ open.delete(label);
128
+ return;
129
+ }
130
+ // A row lands on a row of its own. A spinner mid-row is cleared first
131
+ // and redraws itself beneath on its next tick.
132
+ if (tracked !== null && tracked.counter.column_get() > 0)
133
+ terminal.write('\r\x1b[2K');
134
+ const at = tracked?.counter.rows_get() ?? 0;
135
+ terminal.write(`${row}\n`);
136
+ const rows = tracked === null ? 1 : tracked.counter.rows_get() - at;
137
+ if (stillOpen)
138
+ open.set(label, { at, rows });
139
+ else
140
+ open.delete(label);
141
+ },
63
142
  };
64
143
  }
65
144
  function box_render(title, rows, useColor, useAscii) {