@wix/web50-cli 0.1.0 → 0.1.1

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 (122) hide show
  1. package/dist/cjs/auth/deviceFlow.js +99 -13
  2. package/dist/cjs/auth/deviceFlow.js.map +1 -1
  3. package/dist/cjs/auth/index.js +65 -12
  4. package/dist/cjs/auth/index.js.map +1 -1
  5. package/dist/cjs/auth/secretStore.js.map +1 -1
  6. package/dist/cjs/cli.js +29 -1
  7. package/dist/cjs/cli.js.map +1 -1
  8. package/dist/cjs/commands/bundle.js +95 -0
  9. package/dist/cjs/commands/bundle.js.map +1 -0
  10. package/dist/cjs/commands/conversation.js +50 -0
  11. package/dist/cjs/commands/conversation.js.map +1 -0
  12. package/dist/cjs/commands/conversationWizard.js +526 -0
  13. package/dist/cjs/commands/conversationWizard.js.map +1 -0
  14. package/dist/cjs/commands/deploy.js +192 -0
  15. package/dist/cjs/commands/deploy.js.map +1 -0
  16. package/dist/cjs/commands/embed.js +118 -0
  17. package/dist/cjs/commands/embed.js.map +1 -0
  18. package/dist/cjs/commands/getClientId.js +60 -0
  19. package/dist/cjs/commands/getClientId.js.map +1 -0
  20. package/dist/cjs/commands/init.js +31 -26
  21. package/dist/cjs/commands/init.js.map +1 -1
  22. package/dist/cjs/commands/instructions.js +360 -0
  23. package/dist/cjs/commands/instructions.js.map +1 -0
  24. package/dist/cjs/commands/login.js +59 -4
  25. package/dist/cjs/commands/login.js.map +1 -1
  26. package/dist/cjs/commands/logout.js +16 -0
  27. package/dist/cjs/commands/logout.js.map +1 -0
  28. package/dist/cjs/commands/serve.js +122 -0
  29. package/dist/cjs/commands/serve.js.map +1 -0
  30. package/dist/cjs/commands/storybook.js +102 -0
  31. package/dist/cjs/commands/storybook.js.map +1 -0
  32. package/dist/cjs/commands/validate.js +266 -18
  33. package/dist/cjs/commands/validate.js.map +1 -1
  34. package/dist/cjs/commands/whoami.js +48 -0
  35. package/dist/cjs/commands/whoami.js.map +1 -0
  36. package/dist/cjs/utils/print.js +12 -0
  37. package/dist/cjs/utils/print.js.map +1 -1
  38. package/dist/cjs/utils/project.js +11 -0
  39. package/dist/cjs/utils/project.js.map +1 -1
  40. package/dist/cjs/utils/wixApi.js +55 -0
  41. package/dist/cjs/utils/wixApi.js.map +1 -0
  42. package/dist/esm/auth/deviceFlow.js +106 -13
  43. package/dist/esm/auth/deviceFlow.js.map +1 -1
  44. package/dist/esm/auth/index.js +71 -13
  45. package/dist/esm/auth/index.js.map +1 -1
  46. package/dist/esm/auth/secretStore.js.map +1 -1
  47. package/dist/esm/cli.js +29 -1
  48. package/dist/esm/cli.js.map +1 -1
  49. package/dist/esm/commands/bundle.js +92 -0
  50. package/dist/esm/commands/bundle.js.map +1 -0
  51. package/dist/esm/commands/conversation.js +44 -0
  52. package/dist/esm/commands/conversation.js.map +1 -0
  53. package/dist/esm/commands/conversationWizard.js +527 -0
  54. package/dist/esm/commands/conversationWizard.js.map +1 -0
  55. package/dist/esm/commands/deploy.js +194 -0
  56. package/dist/esm/commands/deploy.js.map +1 -0
  57. package/dist/esm/commands/embed.js +112 -0
  58. package/dist/esm/commands/embed.js.map +1 -0
  59. package/dist/esm/commands/getClientId.js +56 -0
  60. package/dist/esm/commands/getClientId.js.map +1 -0
  61. package/dist/esm/commands/init.js +32 -27
  62. package/dist/esm/commands/init.js.map +1 -1
  63. package/dist/esm/commands/instructions.js +360 -0
  64. package/dist/esm/commands/instructions.js.map +1 -0
  65. package/dist/esm/commands/login.js +62 -6
  66. package/dist/esm/commands/login.js.map +1 -1
  67. package/dist/esm/commands/logout.js +12 -0
  68. package/dist/esm/commands/logout.js.map +1 -0
  69. package/dist/esm/commands/serve.js +117 -0
  70. package/dist/esm/commands/serve.js.map +1 -0
  71. package/dist/esm/commands/storybook.js +97 -0
  72. package/dist/esm/commands/storybook.js.map +1 -0
  73. package/dist/esm/commands/validate.js +269 -19
  74. package/dist/esm/commands/validate.js.map +1 -1
  75. package/dist/esm/commands/whoami.js +44 -0
  76. package/dist/esm/commands/whoami.js.map +1 -0
  77. package/dist/esm/utils/print.js +10 -0
  78. package/dist/esm/utils/print.js.map +1 -1
  79. package/dist/esm/utils/project.js +8 -0
  80. package/dist/esm/utils/project.js.map +1 -1
  81. package/dist/esm/utils/wixApi.js +51 -0
  82. package/dist/esm/utils/wixApi.js.map +1 -0
  83. package/dist/types/auth/deviceFlow.d.ts +3 -1
  84. package/dist/types/auth/deviceFlow.d.ts.map +1 -1
  85. package/dist/types/auth/index.d.ts +5 -1
  86. package/dist/types/auth/index.d.ts.map +1 -1
  87. package/dist/types/auth/secretStore.d.ts +2 -0
  88. package/dist/types/auth/secretStore.d.ts.map +1 -1
  89. package/dist/types/commands/bundle.d.ts +10 -0
  90. package/dist/types/commands/bundle.d.ts.map +1 -0
  91. package/dist/types/commands/conversation.d.ts +3 -0
  92. package/dist/types/commands/conversation.d.ts.map +1 -0
  93. package/dist/types/commands/conversationWizard.d.ts +3 -0
  94. package/dist/types/commands/conversationWizard.d.ts.map +1 -0
  95. package/dist/types/commands/deploy.d.ts +3 -0
  96. package/dist/types/commands/deploy.d.ts.map +1 -0
  97. package/dist/types/commands/embed.d.ts +3 -0
  98. package/dist/types/commands/embed.d.ts.map +1 -0
  99. package/dist/types/commands/getClientId.d.ts +3 -0
  100. package/dist/types/commands/getClientId.d.ts.map +1 -0
  101. package/dist/types/commands/init.d.ts.map +1 -1
  102. package/dist/types/commands/instructions.d.ts +3 -0
  103. package/dist/types/commands/instructions.d.ts.map +1 -0
  104. package/dist/types/commands/login.d.ts.map +1 -1
  105. package/dist/types/commands/logout.d.ts +3 -0
  106. package/dist/types/commands/logout.d.ts.map +1 -0
  107. package/dist/types/commands/serve.d.ts +3 -0
  108. package/dist/types/commands/serve.d.ts.map +1 -0
  109. package/dist/types/commands/storybook.d.ts +3 -0
  110. package/dist/types/commands/storybook.d.ts.map +1 -0
  111. package/dist/types/commands/validate.d.ts +5 -0
  112. package/dist/types/commands/validate.d.ts.map +1 -1
  113. package/dist/types/commands/whoami.d.ts +3 -0
  114. package/dist/types/commands/whoami.d.ts.map +1 -0
  115. package/dist/types/utils/print.d.ts +3 -0
  116. package/dist/types/utils/print.d.ts.map +1 -1
  117. package/dist/types/utils/project.d.ts +10 -0
  118. package/dist/types/utils/project.d.ts.map +1 -1
  119. package/dist/types/utils/wixApi.d.ts +9 -0
  120. package/dist/types/utils/wixApi.d.ts.map +1 -0
  121. package/package.json +5 -5
  122. package/defaults/package.json +0 -42
@@ -0,0 +1,527 @@
1
+ import { Command } from 'commander';
2
+ import * as readline from 'readline';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import inquirer from 'inquirer';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import open from 'open';
9
+ import { wixRequest } from '../utils/wixApi';
10
+
11
+ // ── API response shapes ────────────────────────────────────────────────────
12
+
13
+ // ── Verbose flag ───────────────────────────────────────────────────────────
14
+
15
+ let verbose = false;
16
+
17
+ // ── Wizard state ───────────────────────────────────────────────────────────
18
+
19
+ // ── UI primitives ──────────────────────────────────────────────────────────
20
+
21
+ const BOX_W = 66;
22
+
23
+ /** Double-border header box — visually distinct section for breadcrumbs */
24
+ function printHeader(breadcrumb) {
25
+ const pad = ' '.repeat(Math.max(0, BOX_W - breadcrumb.length - 1));
26
+ console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));
27
+ console.log(`${chalk.cyan('║')} ${chalk.bold(breadcrumb)}${pad}${chalk.cyan('║')}`);
28
+ console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
29
+ console.log();
30
+ }
31
+
32
+ /** Thin separator line with inline hint text */
33
+ function printFooterHints(hints) {
34
+ const line = '─'.repeat(BOX_W + 2);
35
+ console.log(chalk.dim(line));
36
+ console.log(chalk.dim(` ${hints}`));
37
+ console.log();
38
+ }
39
+
40
+ // ── Time helpers ───────────────────────────────────────────────────────────
41
+
42
+ function timeAgo(iso) {
43
+ if (!iso) {
44
+ return 'unknown';
45
+ }
46
+ const diff = Date.now() - new Date(iso).getTime();
47
+ const mins = Math.floor(diff / 60_000);
48
+ const hours = Math.floor(diff / 3_600_000);
49
+ const days = Math.floor(diff / 86_400_000);
50
+ if (mins < 1) {
51
+ return 'just now';
52
+ }
53
+ if (mins < 60) {
54
+ return `${mins}m ago`;
55
+ }
56
+ if (hours < 24) {
57
+ return `${hours}h ago`;
58
+ }
59
+ return `${days}d ago`;
60
+ }
61
+ function formatTime(iso) {
62
+ if (!iso) {
63
+ return '??:??';
64
+ }
65
+ try {
66
+ return new Date(iso).toLocaleTimeString([], {
67
+ hour: '2-digit',
68
+ minute: '2-digit'
69
+ });
70
+ } catch {
71
+ return iso;
72
+ }
73
+ }
74
+ function truncate(text, max) {
75
+ if (max === void 0) {
76
+ max = 50;
77
+ }
78
+ const clean = text.replace(/\n/g, ' ').replace(/<!--.*?-->/g, '').trim();
79
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
80
+ }
81
+
82
+ // ── Markdown renderer ──────────────────────────────────────────────────────
83
+
84
+ function renderMarkdownLine(line) {
85
+ const h3 = line.match(/^### (.+)/);
86
+ if (h3) {
87
+ return chalk.bold.underline(h3[1]);
88
+ }
89
+ const h2 = line.match(/^## (.+)/);
90
+ if (h2) {
91
+ return chalk.bold.underline(h2[1]);
92
+ }
93
+ const h1 = line.match(/^# (.+)/);
94
+ if (h1) {
95
+ return chalk.bold.underline(h1[1]);
96
+ }
97
+ return line.replace(/\*\*(.+?)\*\*/g, (_, t) => chalk.bold(t)).replace(/`([^`]+)`/g, (_, t) => chalk.yellow(t));
98
+ }
99
+ function renderMarkdown(text) {
100
+ return text.split('\n').map(renderMarkdownLine).join('\n');
101
+ }
102
+ function pressEnterToContinue() {
103
+ const rl = readline.createInterface({
104
+ input: process.stdin,
105
+ output: process.stdout
106
+ });
107
+ return new Promise(resolve => {
108
+ rl.question(chalk.dim('\nPress Enter to go back…'), () => {
109
+ rl.close();
110
+ resolve();
111
+ });
112
+ });
113
+ }
114
+
115
+ // ── Row builder ────────────────────────────────────────────────────────────
116
+
117
+ /** Builds a single list row: 🕒 HH:MM (Nm ago) │ message text */
118
+ function buildRow(createdDate, label) {
119
+ const time = chalk.dim(`🕒 ${formatTime(createdDate)}`);
120
+ const ago = chalk.dim(`(${timeAgo(createdDate)})`);
121
+ const divider = chalk.dim(' │ ');
122
+ const text = chalk.white(truncate(label, 42));
123
+ return ` ${time} ${ago}${divider}${text}`;
124
+ }
125
+
126
+ // ── Screens ────────────────────────────────────────────────────────────────
127
+
128
+ async function showRootsScreen() {
129
+ const spinner = ora('Fetching conversations…').start();
130
+ let roots = [];
131
+ try {
132
+ const data = await wixRequest({
133
+ path: '/web5/conversations/cli/roots/query',
134
+ method: 'POST',
135
+ body: {},
136
+ verbose
137
+ });
138
+ spinner.stop();
139
+ roots = data.messages ?? [];
140
+ } catch (err) {
141
+ spinner.fail('Failed to fetch conversations');
142
+ console.error(chalk.red(err.message));
143
+ await pressEnterToContinue();
144
+ return {
145
+ type: 'roots'
146
+ };
147
+ }
148
+ if (roots.length === 0) {
149
+ console.clear();
150
+ console.log(chalk.yellow('No conversations found.'));
151
+ await pressEnterToContinue();
152
+ return {
153
+ type: 'exit'
154
+ };
155
+ }
156
+ console.clear();
157
+ printHeader(`📁 Conversations ${chalk.dim(`${roots.length} total`)}`);
158
+ printFooterHints('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');
159
+ const choices = [...roots.map((r, i) => ({
160
+ name: buildRow(r.createdDate, r.triggerIdContent ?? r.text ?? r.content ?? '(no content)'),
161
+ value: i
162
+ })), new inquirer.Separator('─'.repeat(BOX_W)), {
163
+ name: ` ${chalk.red('✕ Exit')}`,
164
+ value: -1
165
+ }];
166
+ const {
167
+ rootIndex
168
+ } = await inquirer.prompt([{
169
+ type: 'list',
170
+ name: 'rootIndex',
171
+ message: chalk.bold('Select a conversation'),
172
+ choices,
173
+ pageSize: 12
174
+ }]);
175
+ if (rootIndex === -1) {
176
+ return {
177
+ type: 'exit'
178
+ };
179
+ }
180
+ const selected = roots[rootIndex];
181
+ return {
182
+ type: 'messages',
183
+ messageId: selected.id ?? '',
184
+ userQuery: selected.triggerIdContent ?? '',
185
+ conversationId: selected.conversationId ?? ''
186
+ };
187
+ }
188
+ async function showMessagesScreen(messageId, userQuery, conversationId) {
189
+ if (!messageId) {
190
+ console.error(chalk.red('No message ID — returning to root list.'));
191
+ await pressEnterToContinue();
192
+ return {
193
+ type: 'roots'
194
+ };
195
+ }
196
+ const spinner = ora('Loading conversation…').start();
197
+ let messages = [];
198
+ try {
199
+ const data = await wixRequest({
200
+ path: `/web5/conversations/cli/by-message/${messageId}`,
201
+ verbose
202
+ });
203
+ spinner.stop();
204
+ messages = data.messages ?? [];
205
+ } catch (err) {
206
+ spinner.fail('Failed to load conversation');
207
+ console.error(chalk.red(err.message));
208
+ await pressEnterToContinue();
209
+ return {
210
+ type: 'roots'
211
+ };
212
+ }
213
+ if (messages.length === 0) {
214
+ console.clear();
215
+ console.log(chalk.yellow('No messages in this conversation.'));
216
+ await pressEnterToContinue();
217
+ return {
218
+ type: 'roots'
219
+ };
220
+ }
221
+ console.clear();
222
+ const convLabel = conversationId || messageId.slice(0, 12) + '…';
223
+ printHeader(`📁 Conversations ❯ 💬 ${convLabel} ${chalk.dim(`${messages.length} messages`)}`);
224
+ printFooterHints('[↑↓] Navigate [Enter] Expand [Ctrl+C] Quit');
225
+ const choices = messages.map((msg, i) => ({
226
+ name: buildRow(msg.createdDate, msg.triggerIdContent ?? msg.content ?? '(no query)'),
227
+ value: i
228
+ }));
229
+ choices.push(new inquirer.Separator('─'.repeat(BOX_W)));
230
+ choices.push({
231
+ name: ` ${chalk.dim('← Back')}`,
232
+ value: -1
233
+ });
234
+ choices.push({
235
+ name: ` ${chalk.red('✕ Exit')}`,
236
+ value: -2
237
+ });
238
+ const {
239
+ msgIndex
240
+ } = await inquirer.prompt([{
241
+ type: 'list',
242
+ name: 'msgIndex',
243
+ message: chalk.bold('Select a message to expand'),
244
+ choices,
245
+ pageSize: 12
246
+ }]);
247
+ if (msgIndex === -2) {
248
+ return {
249
+ type: 'exit'
250
+ };
251
+ }
252
+ if (msgIndex === -1) {
253
+ return {
254
+ type: 'roots'
255
+ };
256
+ }
257
+ return {
258
+ type: 'message-detail',
259
+ messages,
260
+ messageId,
261
+ userQuery,
262
+ conversationId,
263
+ index: msgIndex
264
+ };
265
+ }
266
+ async function showMessageDetailScreen(messages, index, conversationId) {
267
+ console.clear();
268
+ const msg = messages[index];
269
+ if (!msg) {
270
+ console.error(chalk.red('Message not found.'));
271
+ return;
272
+ }
273
+ const isUser = msg.role === 'user';
274
+ const icon = isUser ? '👤' : '🤖';
275
+ const label = isUser ? 'User Query' : 'AI Response';
276
+ const convLabel = conversationId || 'message';
277
+ printHeader(`📁 Conversations ❯ 💬 ${convLabel} ❯ ${icon} ${label}`);
278
+
279
+ // Metadata row
280
+ console.log(chalk.dim(` 🕒 ${formatTime(msg.createdDate)} (${timeAgo(msg.createdDate)})\n`));
281
+
282
+ // Content
283
+ const content = msg.content ?? '(empty)';
284
+ console.log(isUser ? chalk.cyan(content) : renderMarkdown(content));
285
+ console.log();
286
+
287
+ // Action section
288
+ console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));
289
+ console.log(`${chalk.cyan('║')} ${chalk.bold('Actions')}${' '.repeat(BOX_W - 9)}${chalk.cyan('║')}`);
290
+ console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
291
+ console.log();
292
+ const tid = msg.triggerId ?? '';
293
+ const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${tid}`;
294
+ const {
295
+ action
296
+ } = await inquirer.prompt([{
297
+ type: 'list',
298
+ name: 'action',
299
+ message: chalk.bold('What would you like to do?'),
300
+ choices: [{
301
+ name: ` ${chalk.dim('← Back')}`,
302
+ value: 'back'
303
+ }, {
304
+ name: ` 🌐 Open in browser`,
305
+ value: 'browser'
306
+ }]
307
+ }]);
308
+ if (action === 'browser') {
309
+ await open(browserUrl);
310
+ }
311
+ }
312
+
313
+ // ── Main loop ──────────────────────────────────────────────────────────────
314
+
315
+ async function runWizard(verboseFlag) {
316
+ verbose = verboseFlag;
317
+ process.on('SIGINT', () => {
318
+ console.log(chalk.dim('\nBye.\n'));
319
+ process.exit(0);
320
+ });
321
+ let screen = {
322
+ type: 'roots'
323
+ };
324
+ let running = true;
325
+ while (running) {
326
+ switch (screen.type) {
327
+ case 'roots':
328
+ screen = await showRootsScreen();
329
+ break;
330
+ case 'messages':
331
+ screen = await showMessagesScreen(screen.messageId, screen.userQuery, screen.conversationId);
332
+ break;
333
+ case 'message-detail':
334
+ {
335
+ const s = screen;
336
+ await showMessageDetailScreen(s.messages, s.index, s.conversationId);
337
+ screen = {
338
+ type: 'messages',
339
+ messageId: s.messageId,
340
+ userQuery: s.userQuery,
341
+ conversationId: s.conversationId
342
+ };
343
+ break;
344
+ }
345
+ case 'exit':
346
+ console.clear();
347
+ console.log(chalk.dim('Bye.\n'));
348
+ running = false;
349
+ break;
350
+ }
351
+ }
352
+ process.exit(0);
353
+ }
354
+
355
+ // ── Subcommands ────────────────────────────────────────────────────────────
356
+
357
+ // ── get ────────────────────────────────────────────────────────────────────
358
+
359
+ function printMessages(messages, format) {
360
+ if (messages.length === 0) {
361
+ console.log('(no messages)');
362
+ return;
363
+ }
364
+ if (format === 'json') {
365
+ const view = messages.map(_ref => {
366
+ let {
367
+ role,
368
+ content,
369
+ createdDate
370
+ } = _ref;
371
+ return {
372
+ role,
373
+ content,
374
+ createdDate
375
+ };
376
+ });
377
+ console.log(JSON.stringify(view, null, 2));
378
+ return;
379
+ }
380
+ for (const msg of messages) {
381
+ const isUser = msg.role === 'user';
382
+ const role = isUser ? chalk.cyan('user: ') : chalk.green('assistant:');
383
+ const time = msg.createdDate ? chalk.dim(` [${formatTime(msg.createdDate)}]`) : '';
384
+ const text = (isUser ? msg.triggerIdContent ?? msg.content : msg.content) ?? '(empty)';
385
+ console.log(`${role}${time}`);
386
+ console.log(text);
387
+ console.log();
388
+ }
389
+ }
390
+ const getCmd = new Command('get').description('Get a conversation by message ID (--id) or trigger ID (--tid)').option('--id <id>', 'Message ID — from conversations list').option('--tid <tid>', 'Trigger ID (TID)').option('--format <format>', 'Output format: text (default) or json', 'text').action(async opts => {
391
+ try {
392
+ if (opts.id) {
393
+ const data = await wixRequest({
394
+ path: `/web5/conversations/cli/by-message/${opts.id}`,
395
+ verbose
396
+ });
397
+ printMessages(data.messages ?? [], opts.format ?? 'text');
398
+ return;
399
+ }
400
+ let tid = opts.tid ?? '';
401
+ if (!tid) {
402
+ const rl = readline.createInterface({
403
+ input: process.stdin,
404
+ output: process.stdout
405
+ });
406
+ tid = await new Promise(resolve => {
407
+ rl.question('Enter trigger ID (TID): ', answer => {
408
+ rl.close();
409
+ resolve(answer.trim());
410
+ });
411
+ });
412
+ }
413
+ if (!tid) {
414
+ console.error('Error: provide --id <message-id> or --tid <trigger-id>');
415
+ process.exit(1);
416
+ }
417
+ const data = await wixRequest({
418
+ path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`
419
+ });
420
+ printMessages(data.messages ?? [], opts.format ?? 'text');
421
+ } catch (err) {
422
+ console.error('Error:', err.message);
423
+ process.exit(1);
424
+ }
425
+ });
426
+
427
+ // ── list ───────────────────────────────────────────────────────────────────
428
+
429
+ const listCmd = new Command('list').description('List conversations (non-interactive)').option('--limit <n>', 'Maximum number of conversations to show', '50').option('--since <date>', 'Only show conversations created after this ISO date').action(async opts => {
430
+ const sp = ora('Fetching conversations…').start();
431
+ try {
432
+ const data = await wixRequest({
433
+ path: '/web5/conversations/cli/roots/query',
434
+ method: 'POST',
435
+ body: {},
436
+ verbose
437
+ });
438
+ sp.stop();
439
+ let roots = data.messages ?? [];
440
+ if (opts.since) {
441
+ const since = new Date(opts.since).getTime();
442
+ if (isNaN(since)) {
443
+ console.error('Error: --since must be a valid ISO date string');
444
+ process.exit(1);
445
+ }
446
+ roots = roots.filter(r => {
447
+ if (!r.createdDate) return true;
448
+ return new Date(r.createdDate).getTime() >= since;
449
+ });
450
+ }
451
+ const limit = parseInt(opts.limit ?? '50', 10);
452
+ roots = roots.slice(0, limit);
453
+ if (roots.length === 0) {
454
+ console.log(chalk.yellow('No conversations found.'));
455
+ return;
456
+ }
457
+ for (const r of roots) {
458
+ const label = truncate(r.triggerIdContent ?? r.text ?? r.content ?? '(no content)', 80);
459
+ const time = r.createdDate ? chalk.dim(`[${new Date(r.createdDate).toLocaleString()}] `) : '';
460
+ const id = r.id ? chalk.dim(` --id ${r.id}`) : '';
461
+ console.log(`${time}${label}${id}`);
462
+ }
463
+ } catch (err) {
464
+ sp.stop();
465
+ console.error('Error:', err.message);
466
+ process.exit(1);
467
+ }
468
+ });
469
+
470
+ // ── export ─────────────────────────────────────────────────────────────────
471
+
472
+ const exportCmd = new Command('export').description('Export a conversation to a file').requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation').requiredOption('--output <file>', 'Output file path (.json or .md)').action(async opts => {
473
+ const sp = ora(`Fetching conversation ${opts.id}…`).start();
474
+ try {
475
+ const data = await wixRequest({
476
+ path: `/_api/conversation-history/v1/conversations/by-trigger/${opts.id}`
477
+ });
478
+ sp.stop();
479
+ const outPath = path.resolve(opts.output);
480
+ const ext = path.extname(outPath).toLowerCase();
481
+ if (ext === '.md') {
482
+ const messages = data.messages ?? [];
483
+ const lines = [`# Conversation ${opts.id}`, ''];
484
+ for (const msg of messages) {
485
+ const role = msg.role === 'user' ? '**User**' : '**Assistant**';
486
+ const time = msg.createdDate ? ` _(${msg.createdDate})_` : '';
487
+ lines.push(`### ${role}${time}`, '', msg.content ?? '(empty)', '');
488
+ }
489
+ fs.writeFileSync(outPath, lines.join('\n'), 'utf8');
490
+ } else {
491
+ fs.writeFileSync(outPath, JSON.stringify(data, null, 2), 'utf8');
492
+ }
493
+ console.log(`Exported conversation to ${outPath}`);
494
+ } catch (err) {
495
+ sp.stop();
496
+ console.error('Error:', err.message);
497
+ process.exit(1);
498
+ }
499
+ });
500
+
501
+ // ── open ───────────────────────────────────────────────────────────────────
502
+
503
+ const openCmd = new Command('open').description('Open a conversation in the browser').requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation').action(async opts => {
504
+ const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${opts.id}`;
505
+ console.log(`Opening ${browserUrl}`);
506
+ await open(browserUrl);
507
+ });
508
+
509
+ // ── Command export ─────────────────────────────────────────────────────────
510
+
511
+ const wizardCmd = new Command('wizard').description('Open the interactive TUI to browse conversation history').option('--logs', 'Print raw API requests and responses for debugging').action(async opts => {
512
+ try {
513
+ await runWizard(opts.logs ?? false);
514
+ } catch (err) {
515
+ const msg = err.message ?? '';
516
+ if (msg.includes('force closed') || msg.includes('User force')) {
517
+ console.log(chalk.dim('\nBye.'));
518
+ process.exit(0);
519
+ }
520
+ console.error(chalk.red('Unexpected error: ' + msg));
521
+ process.exit(1);
522
+ }
523
+ });
524
+ export const conversationsCommand = new Command('conversations').description('Conversation history').action(function () {
525
+ this.outputHelp();
526
+ }).addCommand(wizardCmd).addCommand(getCmd).addCommand(listCmd).addCommand(exportCmd).addCommand(openCmd);
527
+ //# sourceMappingURL=conversationWizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Command","readline","fs","path","inquirer","chalk","ora","open","wixRequest","verbose","BOX_W","printHeader","breadcrumb","pad","repeat","Math","max","length","console","log","cyan","bold","printFooterHints","hints","line","dim","timeAgo","iso","diff","Date","now","getTime","mins","floor","hours","days","formatTime","toLocaleTimeString","hour","minute","truncate","text","clean","replace","trim","slice","renderMarkdownLine","h3","match","underline","h2","h1","_","t","yellow","renderMarkdown","split","map","join","pressEnterToContinue","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","close","buildRow","createdDate","label","time","ago","divider","white","showRootsScreen","spinner","start","roots","data","method","body","stop","messages","err","fail","error","red","message","type","clear","choices","r","i","name","triggerIdContent","content","value","Separator","rootIndex","prompt","pageSize","selected","messageId","id","userQuery","conversationId","showMessagesScreen","convLabel","msg","push","msgIndex","index","showMessageDetailScreen","isUser","role","icon","tid","triggerId","browserUrl","action","runWizard","verboseFlag","on","exit","screen","running","s","printMessages","format","view","_ref","JSON","stringify","green","getCmd","description","option","opts","answer","listCmd","sp","since","isNaN","filter","limit","parseInt","toLocaleString","exportCmd","requiredOption","outPath","ext","extname","toLowerCase","lines","writeFileSync","openCmd","wizardCmd","logs","includes","conversationsCommand","outputHelp","addCommand"],"sources":["../../../src/commands/conversationWizard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport { wixRequest } from '../utils/wixApi';\n\n// ── API response shapes ────────────────────────────────────────────────────\n\ninterface ConversationRoot {\n id?: string;\n triggerId?: string;\n conversationId?: string;\n content?: string;\n text?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface QueryRootsResponse {\n messages?: ConversationRoot[];\n}\n\ninterface ConversationMessage {\n id?: string;\n triggerId?: string;\n role?: 'user' | 'assistant' | string;\n content?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface GetConversationResponse {\n messages?: ConversationMessage[];\n}\n\n// ── Verbose flag ───────────────────────────────────────────────────────────\n\nlet verbose = false;\n\n// ── Wizard state ───────────────────────────────────────────────────────────\n\ntype WizardScreen =\n | { type: 'roots' }\n | {\n type: 'messages';\n messageId: string;\n userQuery: string;\n conversationId: string;\n }\n | {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n }\n | { type: 'exit' };\n\n// ── UI primitives ──────────────────────────────────────────────────────────\n\nconst BOX_W = 66;\n\n/** Double-border header box — visually distinct section for breadcrumbs */\nfunction printHeader(breadcrumb: string): void {\n const pad = ' '.repeat(Math.max(0, BOX_W - breadcrumb.length - 1));\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold(breadcrumb)}${pad}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n}\n\n/** Thin separator line with inline hint text */\nfunction printFooterHints(hints: string): void {\n const line = '─'.repeat(BOX_W + 2);\n console.log(chalk.dim(line));\n console.log(chalk.dim(` ${hints}`));\n console.log();\n}\n\n// ── Time helpers ───────────────────────────────────────────────────────────\n\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) {\n return 'unknown';\n }\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n const hours = Math.floor(diff / 3_600_000);\n const days = Math.floor(diff / 86_400_000);\n if (mins < 1) {\n return 'just now';\n }\n if (mins < 60) {\n return `${mins}m ago`;\n }\n if (hours < 24) {\n return `${hours}h ago`;\n }\n return `${days}d ago`;\n}\n\nfunction formatTime(iso: string | undefined): string {\n if (!iso) {\n return '??:??';\n }\n try {\n return new Date(iso).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\nfunction truncate(text: string, max = 50): string {\n const clean = text\n .replace(/\\n/g, ' ')\n .replace(/<!--.*?-->/g, '')\n .trim();\n return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;\n}\n\n// ── Markdown renderer ──────────────────────────────────────────────────────\n\nfunction renderMarkdownLine(line: string): string {\n const h3 = line.match(/^### (.+)/);\n if (h3) {\n return chalk.bold.underline(h3[1]);\n }\n const h2 = line.match(/^## (.+)/);\n if (h2) {\n return chalk.bold.underline(h2[1]);\n }\n const h1 = line.match(/^# (.+)/);\n if (h1) {\n return chalk.bold.underline(h1[1]);\n }\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, (_, t: string) => chalk.bold(t))\n .replace(/`([^`]+)`/g, (_, t: string) => chalk.yellow(t));\n}\n\nfunction renderMarkdown(text: string): string {\n return text.split('\\n').map(renderMarkdownLine).join('\\n');\n}\n\nfunction pressEnterToContinue(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(chalk.dim('\\nPress Enter to go back…'), () => {\n rl.close();\n resolve();\n });\n });\n}\n\n// ── Row builder ────────────────────────────────────────────────────────────\n\n/** Builds a single list row: 🕒 HH:MM (Nm ago) │ message text */\nfunction buildRow(createdDate: string | undefined, label: string): string {\n const time = chalk.dim(`🕒 ${formatTime(createdDate)}`);\n const ago = chalk.dim(`(${timeAgo(createdDate)})`);\n const divider = chalk.dim(' │ ');\n const text = chalk.white(truncate(label, 42));\n return ` ${time} ${ago}${divider}${text}`;\n}\n\n// ── Screens ────────────────────────────────────────────────────────────────\n\nasync function showRootsScreen(): Promise<WizardScreen> {\n const spinner = ora('Fetching conversations…').start();\n\n let roots: ConversationRoot[] = [];\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n spinner.stop();\n roots = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to fetch conversations');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (roots.length === 0) {\n console.clear();\n console.log(chalk.yellow('No conversations found.'));\n await pressEnterToContinue();\n return { type: 'exit' };\n }\n\n console.clear();\n printHeader(`📁 Conversations ${chalk.dim(`${roots.length} total`)}`);\n printFooterHints('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');\n\n const choices = [\n ...roots.map((r, i) => ({\n name: buildRow(\n r.createdDate,\n r.triggerIdContent ?? r.text ?? r.content ?? '(no content)',\n ),\n value: i,\n })),\n new inquirer.Separator('─'.repeat(BOX_W)),\n { name: ` ${chalk.red('✕ Exit')}`, value: -1 },\n ];\n\n const { rootIndex } = await inquirer.prompt<{ rootIndex: number }>([\n {\n type: 'list',\n name: 'rootIndex',\n message: chalk.bold('Select a conversation'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (rootIndex === -1) {\n return { type: 'exit' };\n }\n\n const selected = roots[rootIndex];\n return {\n type: 'messages',\n messageId: selected.id ?? '',\n userQuery: selected.triggerIdContent ?? '',\n conversationId: selected.conversationId ?? '',\n };\n}\n\nasync function showMessagesScreen(\n messageId: string,\n userQuery: string,\n conversationId: string,\n): Promise<WizardScreen> {\n if (!messageId) {\n console.error(chalk.red('No message ID — returning to root list.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n const spinner = ora('Loading conversation…').start();\n\n let messages: ConversationMessage[] = [];\n try {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${messageId}`,\n verbose,\n });\n spinner.stop();\n messages = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to load conversation');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (messages.length === 0) {\n console.clear();\n console.log(chalk.yellow('No messages in this conversation.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n console.clear();\n const convLabel = conversationId || messageId.slice(0, 12) + '…';\n printHeader(\n `📁 Conversations ❯ 💬 ${convLabel} ${chalk.dim(\n `${messages.length} messages`,\n )}`,\n );\n printFooterHints('[↑↓] Navigate [Enter] Expand [Ctrl+C] Quit');\n\n const choices: (\n | { name: string; value: number }\n | InstanceType<typeof inquirer.Separator>\n )[] = messages.map((msg, i) => ({\n name: buildRow(\n msg.createdDate,\n msg.triggerIdContent ?? msg.content ?? '(no query)',\n ),\n value: i,\n }));\n\n choices.push(new inquirer.Separator('─'.repeat(BOX_W)));\n choices.push({ name: ` ${chalk.dim('← Back')}`, value: -1 });\n choices.push({ name: ` ${chalk.red('✕ Exit')}`, value: -2 });\n\n const { msgIndex } = await inquirer.prompt<{ msgIndex: number }>([\n {\n type: 'list',\n name: 'msgIndex',\n message: chalk.bold('Select a message to expand'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (msgIndex === -2) {\n return { type: 'exit' };\n }\n if (msgIndex === -1) {\n return { type: 'roots' };\n }\n return {\n type: 'message-detail',\n messages,\n messageId,\n userQuery,\n conversationId,\n index: msgIndex,\n };\n}\n\nasync function showMessageDetailScreen(\n messages: ConversationMessage[],\n index: number,\n conversationId: string,\n): Promise<void> {\n console.clear();\n\n const msg = messages[index];\n if (!msg) {\n console.error(chalk.red('Message not found.'));\n return;\n }\n\n const isUser = msg.role === 'user';\n const icon = isUser ? '👤' : '🤖';\n const label = isUser ? 'User Query' : 'AI Response';\n const convLabel = conversationId || 'message';\n\n printHeader(`📁 Conversations ❯ 💬 ${convLabel} ❯ ${icon} ${label}`);\n\n // Metadata row\n console.log(\n chalk.dim(\n ` 🕒 ${formatTime(msg.createdDate)} (${timeAgo(msg.createdDate)})\\n`,\n ),\n );\n\n // Content\n const content = msg.content ?? '(empty)';\n console.log(isUser ? chalk.cyan(content) : renderMarkdown(content));\n console.log();\n\n // Action section\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold('Actions')}${' '.repeat(\n BOX_W - 9,\n )}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n\n const tid = msg.triggerId ?? '';\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${tid}`;\n\n const { action } = await inquirer.prompt<{ action: string }>([\n {\n type: 'list',\n name: 'action',\n message: chalk.bold('What would you like to do?'),\n choices: [\n { name: ` ${chalk.dim('← Back')}`, value: 'back' },\n { name: ` 🌐 Open in browser`, value: 'browser' },\n ],\n },\n ]);\n\n if (action === 'browser') {\n await open(browserUrl);\n }\n}\n\n// ── Main loop ──────────────────────────────────────────────────────────────\n\nasync function runWizard(verboseFlag: boolean): Promise<void> {\n verbose = verboseFlag;\n process.on('SIGINT', () => {\n console.log(chalk.dim('\\nBye.\\n'));\n process.exit(0);\n });\n\n let screen: WizardScreen = { type: 'roots' };\n let running = true;\n\n while (running) {\n switch (screen.type) {\n case 'roots':\n screen = await showRootsScreen();\n break;\n\n case 'messages':\n screen = await showMessagesScreen(\n screen.messageId,\n screen.userQuery,\n screen.conversationId,\n );\n break;\n\n case 'message-detail': {\n const s: {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n } = screen;\n await showMessageDetailScreen(s.messages, s.index, s.conversationId);\n screen = {\n type: 'messages',\n messageId: s.messageId,\n userQuery: s.userQuery,\n conversationId: s.conversationId,\n };\n break;\n }\n\n case 'exit':\n console.clear();\n console.log(chalk.dim('Bye.\\n'));\n running = false;\n break;\n }\n }\n process.exit(0);\n}\n\n// ── Subcommands ────────────────────────────────────────────────────────────\n\ninterface ConversationDetail {\n id?: string;\n triggerId?: string;\n active?: boolean;\n messages?: ConversationMessage[];\n [key: string]: unknown;\n}\n\n// ── get ────────────────────────────────────────────────────────────────────\n\nfunction printMessages(messages: ConversationMessage[], format: string): void {\n if (messages.length === 0) {\n console.log('(no messages)');\n return;\n }\n if (format === 'json') {\n const view = messages.map(({ role, content, createdDate }) => ({ role, content, createdDate }));\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n for (const msg of messages) {\n const isUser = msg.role === 'user';\n const role = isUser ? chalk.cyan('user: ') : chalk.green('assistant:');\n const time = msg.createdDate ? chalk.dim(` [${formatTime(msg.createdDate)}]`) : '';\n const text = (isUser ? (msg.triggerIdContent ?? msg.content) : msg.content) ?? '(empty)';\n console.log(`${role}${time}`);\n console.log(text);\n console.log();\n }\n}\n\nconst getCmd = new Command('get')\n .description('Get a conversation by message ID (--id) or trigger ID (--tid)')\n .option('--id <id>', 'Message ID — from conversations list')\n .option('--tid <tid>', 'Trigger ID (TID)')\n .option('--format <format>', 'Output format: text (default) or json', 'text')\n .action(async (opts: { id?: string; tid?: string; format?: string }) => {\n try {\n if (opts.id) {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${opts.id}`,\n verbose,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n return;\n }\n\n let tid: string = opts.tid ?? '';\n if (!tid) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n tid = await new Promise<string>((resolve) => {\n rl.question('Enter trigger ID (TID): ', (answer) => { rl.close(); resolve(answer.trim()); });\n });\n }\n if (!tid) {\n console.error('Error: provide --id <message-id> or --tid <trigger-id>');\n process.exit(1);\n }\n\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nconst listCmd = new Command('list')\n .description('List conversations (non-interactive)')\n .option('--limit <n>', 'Maximum number of conversations to show', '50')\n .option('--since <date>', 'Only show conversations created after this ISO date')\n .action(async (opts: { limit?: string; since?: string }) => {\n const sp = ora('Fetching conversations…').start();\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n sp.stop();\n\n let roots = data.messages ?? [];\n\n if (opts.since) {\n const since = new Date(opts.since).getTime();\n if (isNaN(since)) {\n console.error('Error: --since must be a valid ISO date string');\n process.exit(1);\n }\n roots = roots.filter((r) => {\n if (!r.createdDate) return true;\n return new Date(r.createdDate).getTime() >= since;\n });\n }\n\n const limit = parseInt(opts.limit ?? '50', 10);\n roots = roots.slice(0, limit);\n\n if (roots.length === 0) {\n console.log(chalk.yellow('No conversations found.'));\n return;\n }\n for (const r of roots) {\n const label = truncate(r.triggerIdContent ?? r.text ?? r.content ?? '(no content)', 80);\n const time = r.createdDate\n ? chalk.dim(`[${new Date(r.createdDate).toLocaleString()}] `)\n : '';\n const id = r.id ? chalk.dim(` --id ${r.id}`) : '';\n console.log(`${time}${label}${id}`);\n }\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── export ─────────────────────────────────────────────────────────────────\n\nconst exportCmd = new Command('export')\n .description('Export a conversation to a file')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .requiredOption('--output <file>', 'Output file path (.json or .md)')\n .action(async (opts: { id: string; output: string }) => {\n const sp = ora(`Fetching conversation ${opts.id}…`).start();\n try {\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${opts.id}`,\n });\n sp.stop();\n\n const outPath = path.resolve(opts.output);\n const ext = path.extname(outPath).toLowerCase();\n\n if (ext === '.md') {\n const messages = data.messages ?? [];\n const lines: string[] = [`# Conversation ${opts.id}`, ''];\n for (const msg of messages) {\n const role = msg.role === 'user' ? '**User**' : '**Assistant**';\n const time = msg.createdDate ? ` _(${msg.createdDate})_` : '';\n lines.push(`### ${role}${time}`, '', msg.content ?? '(empty)', '');\n }\n fs.writeFileSync(outPath, lines.join('\\n'), 'utf8');\n } else {\n fs.writeFileSync(outPath, JSON.stringify(data, null, 2), 'utf8');\n }\n\n console.log(`Exported conversation to ${outPath}`);\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── open ───────────────────────────────────────────────────────────────────\n\nconst openCmd = new Command('open')\n .description('Open a conversation in the browser')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .action(async (opts: { id: string }) => {\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${opts.id}`;\n console.log(`Opening ${browserUrl}`);\n await open(browserUrl);\n });\n\n// ── Command export ─────────────────────────────────────────────────────────\n\nconst wizardCmd = new Command('wizard')\n .description('Open the interactive TUI to browse conversation history')\n .option('--logs', 'Print raw API requests and responses for debugging')\n .action(async (opts) => {\n try {\n await runWizard(opts.logs ?? false);\n } catch (err) {\n const msg = (err as Error).message ?? '';\n if (msg.includes('force closed') || msg.includes('User force')) {\n console.log(chalk.dim('\\nBye.'));\n process.exit(0);\n }\n console.error(chalk.red('Unexpected error: ' + msg));\n process.exit(1);\n }\n });\n\nexport const conversationsCommand = new Command('conversations')\n .description('Conversation history')\n .action(function (this: Command) {\n this.outputHelp();\n })\n .addCommand(wizardCmd)\n .addCommand(getCmd)\n .addCommand(listCmd)\n .addCommand(exportCmd)\n .addCommand(openCmd);\n"],"mappings":"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","ignoreList":[]}