@raidiant/notifai 0.2.0 → 0.3.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.
@@ -0,0 +1,604 @@
1
+ /**
2
+ * The interactive app — what `notifai` does when a person runs it.
3
+ *
4
+ * Everything here is a shell around commands that already exist. `init`,
5
+ * `login`, `doctor`, `send`, `hooks install` and `config set` keep their
6
+ * behaviour, their validation and their exit codes; this module decides what to
7
+ * offer, in what order, and how to say it. That is deliberate: a second
8
+ * implementation of "set a config value" would be a second set of bugs, and the
9
+ * menu would slowly stop agreeing with the flags.
10
+ *
11
+ * The module is imported dynamically, only after the caller is known to be a
12
+ * human at a terminal. Nothing an agent runs — `send`, `ask`, and above all the
13
+ * hook that runs in front of every prompt the user types — may pay to load a
14
+ * prompt library it will never draw.
15
+ *
16
+ * Three things shape the layout:
17
+ *
18
+ * The menu leads with whatever is actually in the way. Someone who is not
19
+ * signed in is offered sign-in first; someone with no device that can receive
20
+ * is offered a device; everyone else is offered the test notification, because
21
+ * seeing the thing arrive on your phone is what makes the product real.
22
+ *
23
+ * Detail is earned, not given. A settings group shows fourteen one-line
24
+ * summaries, and the paragraph explaining a key appears once the reader has
25
+ * picked that key.
26
+ *
27
+ * Cancelling always goes back one level and never leaves the terminal in a
28
+ * strange state.
29
+ */
30
+ import * as clack from '@clack/prompts';
31
+ import { EXIT, assessReadiness, canDeviceReceive, configSetCommand, deviceInventory, doctorCommand, hooksInstallCommand, initCommand, loginCommand, logoutCommand, sendCommand, } from './commands.js';
32
+ import { CONFIG_KEYS, loadConfig } from './config.js';
33
+ import { CONFIG_GROUPS, acceptedValues, boundsHint, configInfo, configKeysByGroup, describeSource, formatValue, } from './config-schema.js';
34
+ import { firstBlocker } from './readiness.js';
35
+ import { printBanner, tagline } from './ui/banner.js';
36
+ import { card, glyph, mark, style } from './ui/theme.js';
37
+ /** Clack returns a symbol when the user pressed Ctrl-C or Escape. */
38
+ function cancelled(value) {
39
+ return clack.isCancel(value);
40
+ }
41
+ export async function interactiveCommand(deps, version) {
42
+ await printBanner();
43
+ process.stdout.write(` ${tagline(version)}\n`);
44
+ let readiness = await assess(deps);
45
+ let first = true;
46
+ for (;;) {
47
+ renderStatus(readiness, { compact: !first });
48
+ first = false;
49
+ const choice = await clack.select({
50
+ message: 'What would you like to do?',
51
+ options: menuFor(readiness),
52
+ });
53
+ if (cancelled(choice))
54
+ return farewell();
55
+ switch (choice) {
56
+ case 'quit':
57
+ return farewell();
58
+ case 'setup':
59
+ await initCommand(deps, {});
60
+ readiness = await assess(deps);
61
+ break;
62
+ case 'account':
63
+ if (await accountScreen(deps, readiness))
64
+ readiness = await assess(deps);
65
+ break;
66
+ case 'test':
67
+ await testNotificationScreen(deps);
68
+ readiness = await assess(deps);
69
+ break;
70
+ case 'devices':
71
+ await devicesScreen(deps);
72
+ break;
73
+ case 'settings':
74
+ await settingsScreen(deps);
75
+ readiness = await assess(deps);
76
+ break;
77
+ case 'routing':
78
+ if (await routingScreen(deps, readiness))
79
+ readiness = await assess(deps);
80
+ break;
81
+ case 'doctor':
82
+ await doctorCommand(deps, {});
83
+ readiness = await assess(deps);
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ function farewell() {
89
+ clack.outro(style.dim(`${glyph.bullet} bye`));
90
+ return EXIT.ok;
91
+ }
92
+ async function assess(deps) {
93
+ const spinner = clack.spinner();
94
+ spinner.start('Checking your setup');
95
+ try {
96
+ return await assessReadiness(deps);
97
+ }
98
+ finally {
99
+ spinner.stop(style.dim('Setup checked'));
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Status
104
+ // ---------------------------------------------------------------------------
105
+ function stateById(readiness, id) {
106
+ return readiness.states.find((state) => state.id === id);
107
+ }
108
+ function toneOf(state) {
109
+ if (state === undefined)
110
+ return 'pending';
111
+ switch (state.status) {
112
+ case 'ready':
113
+ return 'ok';
114
+ case 'gap':
115
+ return 'bad';
116
+ case 'optional-gap':
117
+ return 'warn';
118
+ case 'unknown':
119
+ return 'pending';
120
+ }
121
+ }
122
+ /**
123
+ * The status card: four lines that answer "is this working", with the detail
124
+ * behind `doctor` rather than in front of everyone.
125
+ *
126
+ * `doctor` reports fourteen states because that is what a report is for. Home
127
+ * shows the four that change what you would do next, which is why this reads
128
+ * the same readiness model rather than a second one that could disagree.
129
+ */
130
+ function renderStatus(readiness, options) {
131
+ const rows = [
132
+ {
133
+ label: 'Account',
134
+ state: stateById(readiness, 'credential'),
135
+ summary: (s) => (s?.status === 'ready' ? accountSummary(readiness) : 'not signed in'),
136
+ },
137
+ {
138
+ label: 'Devices',
139
+ state: stateById(readiness, 'devices'),
140
+ summary: (s) => shorten(s?.detail ?? 'unknown'),
141
+ },
142
+ {
143
+ label: 'Project',
144
+ state: stateById(readiness, 'project'),
145
+ summary: (s) => (s?.status === 'ready' ? firstQuoted(s.detail) : 'not named'),
146
+ },
147
+ {
148
+ label: 'Questions',
149
+ state: stateById(readiness, 'hooks'),
150
+ summary: (s) => (s?.status === 'ready' ? 'routing to your devices' : shorten(s?.detail ?? 'not wired')),
151
+ },
152
+ ];
153
+ if (options.compact === true) {
154
+ const summary = rows.map((row) => `${mark(toneOf(row.state))} ${style.dim(row.label)}`).join(' ');
155
+ process.stdout.write(`\n ${summary}\n\n`);
156
+ return;
157
+ }
158
+ const labelWidth = Math.max(...rows.map((row) => row.label.length));
159
+ const body = rows.map((row) => `${mark(toneOf(row.state))} ${style.dim(row.label.padEnd(labelWidth))} ${row.summary(row.state)}`);
160
+ process.stdout.write('\n');
161
+ for (const line of card('Status', body))
162
+ process.stdout.write(`${line}\n`);
163
+ process.stdout.write('\n');
164
+ }
165
+ function accountSummary(readiness) {
166
+ const auth = stateById(readiness, 'auth');
167
+ const email = auth?.detail.match(/\(([^)]+@[^)]+)\)/)?.[1];
168
+ return email ?? 'signed in';
169
+ }
170
+ function firstQuoted(text) {
171
+ return text.match(/"([^"]+)"/)?.[1] ?? text;
172
+ }
173
+ function shorten(text, limit = 46) {
174
+ const flat = text.replace(/\s+/g, ' ').trim();
175
+ const clipped = flat.split(' — ')[0] ?? flat;
176
+ return clipped.length > limit ? `${clipped.slice(0, limit - 1)}…` : clipped;
177
+ }
178
+ /**
179
+ * The menu, ordered by what is actually in the way.
180
+ *
181
+ * A fixed menu would put "Send a test notification" first for someone who has
182
+ * not signed in — an action that cannot succeed, offered ahead of the one that
183
+ * would unblock it.
184
+ */
185
+ function menuFor(readiness) {
186
+ const signedIn = stateById(readiness, 'credential')?.status === 'ready';
187
+ const devices = stateById(readiness, 'devices');
188
+ const hasDevice = devices?.status === 'ready';
189
+ const routing = stateById(readiness, 'hooks');
190
+ const blocker = firstBlocker(readiness);
191
+ const options = [];
192
+ if (!signedIn) {
193
+ options.push({ value: 'account', label: 'Sign in', hint: 'approve this machine in your browser' });
194
+ }
195
+ else if (!hasDevice) {
196
+ options.push({ value: 'devices', label: 'Add a device', hint: 'install the app on your phone or Mac' });
197
+ }
198
+ else {
199
+ options.push({
200
+ value: 'test',
201
+ label: 'Send a test notification',
202
+ hint: 'prove the whole path, end to end',
203
+ });
204
+ }
205
+ if (blocker !== null && signedIn) {
206
+ options.push({ value: 'setup', label: 'Finish setup', hint: shorten(blocker.title.toLowerCase(), 40) });
207
+ }
208
+ options.push({ value: 'settings', label: 'Settings', hint: 'sounds, timing, presence, project' }, {
209
+ value: 'routing',
210
+ label: 'Question routing',
211
+ hint: routing?.status === 'ready' ? 'wired — review or change' : 'let agents reach you when you step away',
212
+ });
213
+ if (signedIn && hasDevice) {
214
+ options.push({ value: 'devices', label: 'Devices', hint: 'what can receive right now' });
215
+ }
216
+ options.push({ value: 'doctor', label: 'Run diagnostics', hint: 'check every part of the setup' }, { value: 'account', label: 'Account', hint: signedIn ? 'plan, machine, sign out' : 'sign in' }, { value: 'quit', label: 'Quit' });
217
+ return options;
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Test notification
221
+ // ---------------------------------------------------------------------------
222
+ async function testNotificationScreen(deps) {
223
+ const config = loadConfig({ cwd: deps.cwd, env: deps.env });
224
+ const project = config.project.value;
225
+ const title = await clack.text({
226
+ message: 'Title',
227
+ placeholder: 'Test from Notifai',
228
+ defaultValue: 'Test from Notifai',
229
+ });
230
+ if (cancelled(title))
231
+ return;
232
+ const body = await clack.text({
233
+ message: 'Body',
234
+ placeholder: 'If you can read this on your phone, it works.',
235
+ defaultValue: 'If you can read this on your phone, it works.',
236
+ });
237
+ if (cancelled(body))
238
+ return;
239
+ const sound = await clack.select({
240
+ message: 'Sound',
241
+ options: [
242
+ { value: 'default', label: 'Default', hint: 'the standard tone' },
243
+ { value: 'done', label: 'Done', hint: 'the completion chime' },
244
+ { value: 'attention', label: 'Attention' },
245
+ { value: 'none', label: 'Silent' },
246
+ ],
247
+ initialValue: 'default',
248
+ });
249
+ if (cancelled(sound))
250
+ return;
251
+ clack.log.step('Sending, then waiting for your devices to confirm…');
252
+ const code = await sendCommand(deps, {
253
+ title: String(title),
254
+ body: String(body),
255
+ sound: String(sound),
256
+ ...(project !== null ? { project } : {}),
257
+ });
258
+ if (code === EXIT.ok)
259
+ clack.log.success('Delivered. Check the device it landed on.');
260
+ else
261
+ clack.log.error('That did not get through — `Run diagnostics` will say why.');
262
+ }
263
+ // ---------------------------------------------------------------------------
264
+ // Devices
265
+ // ---------------------------------------------------------------------------
266
+ async function devicesScreen(deps) {
267
+ const spinner = clack.spinner();
268
+ spinner.start('Loading your devices');
269
+ const devices = await deviceInventory(deps);
270
+ spinner.stop(style.dim('Devices loaded'));
271
+ if (devices === null) {
272
+ clack.log.warn('Could not reach the service. Sign in, or check the connection.');
273
+ return;
274
+ }
275
+ if (devices.length === 0) {
276
+ clack.note('No devices are registered yet.\n\n' +
277
+ 'Install the Notifai companion app on your iPhone or Mac, sign in with the\n' +
278
+ 'same account, and allow notifications when it asks.', 'No devices');
279
+ return;
280
+ }
281
+ const body = devices
282
+ .map((device) => {
283
+ const ready = canDeviceReceive(device);
284
+ const detail = ready ? 'ready' : `not ready ${glyph.bullet} permission: ${device.permission_status}`;
285
+ return (`${mark(ready ? 'ok' : 'warn')} ${style.value(device.display_name)} ${style.dim(`(${device.platform})`)}\n` +
286
+ ` ${style.dim(detail)}\n` +
287
+ ` ${style.dim(device.device_id)}`);
288
+ })
289
+ .join('\n\n');
290
+ clack.note(body, `${devices.length} device${devices.length === 1 ? '' : 's'}`);
291
+ }
292
+ // ---------------------------------------------------------------------------
293
+ // Settings
294
+ // ---------------------------------------------------------------------------
295
+ async function settingsScreen(deps) {
296
+ for (;;) {
297
+ const config = loadConfig({ cwd: deps.cwd, env: deps.env });
298
+ const group = await clack.select({
299
+ message: 'Settings',
300
+ options: [
301
+ ...CONFIG_GROUPS.map((entry) => ({
302
+ value: entry.id,
303
+ label: entry.title,
304
+ hint: changedCount(config, entry.id),
305
+ })),
306
+ { value: 'back', label: '← Back' },
307
+ ],
308
+ });
309
+ if (cancelled(group) || group === 'back')
310
+ return;
311
+ await settingsGroupScreen(deps, group);
312
+ }
313
+ }
314
+ /** "3 changed" beats repeating the group blurb the reader already saw. */
315
+ function changedCount(config, group) {
316
+ const keys = configKeysByGroup(group);
317
+ const changed = keys.filter((info) => config[info.key].source !== 'default').length;
318
+ return changed === 0 ? style.dim('all default') : style.dim(`${changed} changed`);
319
+ }
320
+ async function settingsGroupScreen(deps, group) {
321
+ for (;;) {
322
+ const config = loadConfig({ cwd: deps.cwd, env: deps.env });
323
+ const info = CONFIG_GROUPS.find((entry) => entry.id === group);
324
+ const keys = configKeysByGroup(group);
325
+ const key = await clack.select({
326
+ message: info.title,
327
+ options: [
328
+ ...keys.map((entry) => {
329
+ const resolved = config[entry.key];
330
+ const source = describeSource(resolved.source);
331
+ const value = formatValue(entry.key, resolved.value);
332
+ return {
333
+ value: entry.key,
334
+ label: entry.label,
335
+ hint: source.label === 'default' ? style.dim(value) : `${value} ${style.dim(`(${source.label})`)}`,
336
+ };
337
+ }),
338
+ { value: 'back', label: '← Back' },
339
+ ],
340
+ });
341
+ if (cancelled(key) || key === 'back')
342
+ return;
343
+ await settingDetailScreen(deps, key);
344
+ }
345
+ }
346
+ /**
347
+ * One key, fully explained, with the option to change it.
348
+ *
349
+ * This is where the paragraph lives. Everything above stayed one line per key
350
+ * so that arriving here means the reader has already said which key they care
351
+ * about.
352
+ */
353
+ async function settingDetailScreen(deps, key) {
354
+ const config = loadConfig({ cwd: deps.cwd, env: deps.env });
355
+ const info = configInfo(key);
356
+ const resolved = config[key];
357
+ const source = describeSource(resolved.source);
358
+ const lines = [
359
+ info.detail,
360
+ '',
361
+ `${style.dim('Now')} ${style.value(formatValue(key, resolved.value))} ${style.dim(`${glyph.bullet} ${source.label}`)}`,
362
+ `${style.dim('Accepts')} ${acceptedValues(key)}`,
363
+ `${style.dim('Key')} ${style.code(key)}`,
364
+ ];
365
+ clack.note(lines.join('\n'), info.label);
366
+ const action = await clack.select({
367
+ message: 'Change it?',
368
+ options: [
369
+ // Not lower-cased: "Change only when i have stepped away" is what
370
+ // `toLowerCase` makes of a label that starts a sentence.
371
+ { value: 'change', label: `Change this setting`, hint: style.code(info.key) },
372
+ { value: 'back', label: '← Back' },
373
+ ],
374
+ initialValue: 'back',
375
+ });
376
+ if (cancelled(action) || action === 'back')
377
+ return;
378
+ const value = await promptForValue(deps, key);
379
+ if (value === null)
380
+ return;
381
+ const layer = await chooseLayer();
382
+ if (layer === null)
383
+ return;
384
+ const code = await configSetCommand(deps, key, value, {
385
+ yes: true,
386
+ ...(layer === 'project' ? { project: true } : {}),
387
+ ...(layer === 'local' ? { local: true } : {}),
388
+ });
389
+ if (code === EXIT.ok)
390
+ clack.log.success(`${info.label} is now ${formatValueRaw(key, value)}`);
391
+ }
392
+ function formatValueRaw(key, raw) {
393
+ const info = configInfo(key);
394
+ if (info.kind === 'boolean')
395
+ return raw === 'true' ? 'yes' : 'no';
396
+ return raw;
397
+ }
398
+ /** The prompt shape follows the key's type; validation stays in `config set`. */
399
+ async function promptForValue(deps, key) {
400
+ const info = configInfo(key);
401
+ if (info.kind === 'boolean') {
402
+ const answer = await clack.select({
403
+ message: info.label,
404
+ options: [
405
+ { value: 'true', label: 'Yes' },
406
+ { value: 'false', label: 'No' },
407
+ ],
408
+ });
409
+ return cancelled(answer) ? null : String(answer);
410
+ }
411
+ if (info.kind === 'enum') {
412
+ const answer = await clack.select({
413
+ message: info.label,
414
+ options: (info.choices ?? []).map((choice) => ({
415
+ value: choice,
416
+ label: choice,
417
+ ...(info.choiceHints?.[choice] !== undefined ? { hint: info.choiceHints[choice] } : {}),
418
+ })),
419
+ });
420
+ return cancelled(answer) ? null : String(answer);
421
+ }
422
+ // The one key whose legal values the machine knows better than the reader.
423
+ if (key === 'devices')
424
+ return await promptForDevices(deps);
425
+ const bounds = boundsHint(key);
426
+ const answer = await clack.text({
427
+ message: info.label,
428
+ ...(info.example !== undefined ? { placeholder: info.example } : {}),
429
+ validate: (input) => {
430
+ const trimmed = (input ?? '').trim();
431
+ if (trimmed === '')
432
+ return 'Enter a value, or press Escape to go back.';
433
+ if (info.kind === 'integer') {
434
+ if (!/^-?\d+$/.test(trimmed))
435
+ return `${info.label} is a whole number of seconds.`;
436
+ const range = boundsRange(key);
437
+ if (bounds !== null && range !== null) {
438
+ const parsed = Number(trimmed);
439
+ if (parsed < range.min || parsed > range.max)
440
+ return `Must be between ${bounds}.`;
441
+ }
442
+ }
443
+ if (info.kind === 'url' && !/^https?:\/\//.test(trimmed))
444
+ return 'Must start with http:// or https://.';
445
+ return undefined;
446
+ },
447
+ });
448
+ return cancelled(answer) ? null : String(answer).trim();
449
+ }
450
+ function boundsRange(key) {
451
+ const hint = boundsHint(key);
452
+ if (hint === null)
453
+ return null;
454
+ const [min, max] = hint.replace(/[^\d–]/g, '').split('–');
455
+ if (min === undefined || max === undefined)
456
+ return null;
457
+ return { min: Number(min), max: Number(max) };
458
+ }
459
+ async function promptForDevices(deps) {
460
+ const spinner = clack.spinner();
461
+ spinner.start('Loading your devices');
462
+ const devices = await deviceInventory(deps);
463
+ spinner.stop(style.dim('Devices loaded'));
464
+ if (devices === null || devices.length === 0) {
465
+ clack.log.warn('No devices to choose from yet.');
466
+ return null;
467
+ }
468
+ const picked = await clack.multiselect({
469
+ message: 'Which devices should receive by default?',
470
+ options: devices.map((device) => ({
471
+ value: device.device_id,
472
+ label: device.display_name,
473
+ hint: canDeviceReceive(device) ? device.platform : `${device.platform} ${glyph.bullet} not ready`,
474
+ })),
475
+ required: true,
476
+ });
477
+ return cancelled(picked) ? null : picked.join(',');
478
+ }
479
+ /**
480
+ * Which layer the value lands in.
481
+ *
482
+ * Asked every time rather than defaulting, because the difference between
483
+ * "my machine" and "everyone who clones this repository" is not recoverable by
484
+ * guessing, and the shared file is the one that ends up in a commit.
485
+ */
486
+ async function chooseLayer() {
487
+ const layer = await clack.select({
488
+ message: 'Where should this apply?',
489
+ options: [
490
+ { value: 'global', label: 'This machine', hint: 'every project you work on here' },
491
+ { value: 'project', label: 'This project, shared', hint: '.notifai/config.toml — commit it' },
492
+ { value: 'local', label: 'This project, just me', hint: 'config.local.toml — keep it gitignored' },
493
+ ],
494
+ initialValue: 'global',
495
+ });
496
+ return cancelled(layer) ? null : layer;
497
+ }
498
+ // ---------------------------------------------------------------------------
499
+ // Question routing
500
+ // ---------------------------------------------------------------------------
501
+ /**
502
+ * Which harnesses are wired, without the install paths.
503
+ *
504
+ * The underlying state lists every installation with its absolute file path,
505
+ * which is the right level of detail for `doctor` and far too much for a
506
+ * summary card — four paths wrap across six lines and push the settings
507
+ * underneath them out of alignment.
508
+ */
509
+ function wiringSummary(hooks) {
510
+ if (hooks === undefined)
511
+ return 'unknown';
512
+ const named = hooks.detail.replace(/\s*\([^)]*\)/g, '').trim();
513
+ return named === '' ? hooks.detail : named;
514
+ }
515
+ /** Returns true when something changed and the status card needs refreshing. */
516
+ async function routingScreen(deps, readiness) {
517
+ const hooks = stateById(readiness, 'hooks');
518
+ const config = loadConfig({ cwd: deps.cwd, env: deps.env });
519
+ const row = (label, value) => `${style.dim(label.padEnd(16))}${value}`;
520
+ clack.note('When an agent registers a question, it appears in your terminal first.\n' +
521
+ 'If you are still here, it stays here. Once you step away, it goes to\n' +
522
+ 'your phone and Mac as a notification with real answer buttons, and\n' +
523
+ 'your answer comes back to the agent.\n\n' +
524
+ [
525
+ row('Wired to', wiringSummary(hooks)),
526
+ row('Send', config.ask_notifications.value ? 'yes' : 'no — questions stay in the terminal'),
527
+ row('Only when away', config.require_idle.value ? 'yes' : 'no — reach me even while I am working'),
528
+ row('Away after', formatValue('away_after_seconds', config.away_after_seconds.value)),
529
+ row('Grace', formatValue('ask_grace_seconds', config.ask_grace_seconds.value)),
530
+ ].join('\n'), 'Question routing');
531
+ const action = await clack.select({
532
+ message: 'Question routing',
533
+ options: [
534
+ {
535
+ value: 'install',
536
+ label: hooks?.status === 'ready' ? 'Re-install hooks for this harness' : 'Wire up my harness',
537
+ hint: 'Claude Code, Codex, Cursor, OpenCode',
538
+ },
539
+ { value: 'settings', label: 'Change presence settings', hint: 'when a question may leave this terminal' },
540
+ { value: 'back', label: '← Back' },
541
+ ],
542
+ });
543
+ if (cancelled(action) || action === 'back')
544
+ return false;
545
+ if (action === 'settings') {
546
+ await settingsGroupScreen(deps, 'questions');
547
+ return true;
548
+ }
549
+ const scope = await clack.select({
550
+ message: 'Install for',
551
+ options: [
552
+ { value: 'project', label: 'This project only' },
553
+ { value: 'global', label: 'Every project on this machine' },
554
+ ],
555
+ initialValue: 'project',
556
+ });
557
+ if (cancelled(scope))
558
+ return false;
559
+ hooksInstallCommand(deps, scope === 'global' ? { global: true } : {});
560
+ return true;
561
+ }
562
+ // ---------------------------------------------------------------------------
563
+ // Account
564
+ // ---------------------------------------------------------------------------
565
+ /** Returns true when something changed and the status card needs refreshing. */
566
+ async function accountScreen(deps, readiness) {
567
+ const signedIn = stateById(readiness, 'credential')?.status === 'ready';
568
+ if (!signedIn) {
569
+ const go = await clack.confirm({
570
+ message: 'Sign in now? This opens your browser to approve this machine.',
571
+ initialValue: true,
572
+ });
573
+ if (cancelled(go) || go !== true)
574
+ return false;
575
+ await loginCommand(deps, {});
576
+ return true;
577
+ }
578
+ const auth = stateById(readiness, 'auth');
579
+ const credential = stateById(readiness, 'credential');
580
+ clack.note(`${style.dim('Machine')} ${credential?.detail ?? 'unknown'}\n${style.dim('Account')} ${auth?.detail ?? 'unknown'}`, 'Account');
581
+ const action = await clack.select({
582
+ message: 'Account',
583
+ options: [
584
+ { value: 'relogin', label: 'Pair this machine again' },
585
+ { value: 'logout', label: 'Sign out', hint: 'removes the stored credential' },
586
+ { value: 'back', label: '← Back' },
587
+ ],
588
+ initialValue: 'back',
589
+ });
590
+ if (cancelled(action) || action === 'back')
591
+ return false;
592
+ if (action === 'logout') {
593
+ const sure = await clack.confirm({ message: 'Remove the stored credential?', initialValue: false });
594
+ if (cancelled(sure) || sure !== true)
595
+ return false;
596
+ logoutCommand(deps);
597
+ return true;
598
+ }
599
+ await loginCommand(deps, {});
600
+ return true;
601
+ }
602
+ /** Exported for the settings command to reuse the same key vocabulary. */
603
+ export const INTERACTIVE_CONFIG_KEYS = CONFIG_KEYS;
604
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}