@vamdawn/cconvo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/cli.d.ts +4 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +213 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/completion.d.ts +7 -0
  8. package/dist/completion.d.ts.map +1 -0
  9. package/dist/completion.js +227 -0
  10. package/dist/completion.js.map +1 -0
  11. package/dist/core/parser.d.ts +12 -0
  12. package/dist/core/parser.d.ts.map +1 -0
  13. package/dist/core/parser.js +178 -0
  14. package/dist/core/parser.js.map +1 -0
  15. package/dist/core/scanner.d.ts +9 -0
  16. package/dist/core/scanner.d.ts.map +1 -0
  17. package/dist/core/scanner.js +109 -0
  18. package/dist/core/scanner.js.map +1 -0
  19. package/dist/exporters/html.d.ts +3 -0
  20. package/dist/exporters/html.d.ts.map +1 -0
  21. package/dist/exporters/html.js +288 -0
  22. package/dist/exporters/html.js.map +1 -0
  23. package/dist/exporters/index.d.ts +7 -0
  24. package/dist/exporters/index.d.ts.map +1 -0
  25. package/dist/exporters/index.js +40 -0
  26. package/dist/exporters/index.js.map +1 -0
  27. package/dist/exporters/json.d.ts +3 -0
  28. package/dist/exporters/json.d.ts.map +1 -0
  29. package/dist/exporters/json.js +45 -0
  30. package/dist/exporters/json.js.map +1 -0
  31. package/dist/exporters/markdown.d.ts +3 -0
  32. package/dist/exporters/markdown.d.ts.map +1 -0
  33. package/dist/exporters/markdown.js +87 -0
  34. package/dist/exporters/markdown.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interactive.d.ts +2 -0
  40. package/dist/interactive.d.ts.map +1 -0
  41. package/dist/interactive.js +348 -0
  42. package/dist/interactive.js.map +1 -0
  43. package/dist/models/types.d.ts +158 -0
  44. package/dist/models/types.d.ts.map +1 -0
  45. package/dist/models/types.js +2 -0
  46. package/dist/models/types.js.map +1 -0
  47. package/dist/utils/format.d.ts +13 -0
  48. package/dist/utils/format.d.ts.map +1 -0
  49. package/dist/utils/format.js +104 -0
  50. package/dist/utils/format.js.map +1 -0
  51. package/dist/utils/path.d.ts +10 -0
  52. package/dist/utils/path.d.ts.map +1 -0
  53. package/dist/utils/path.js +37 -0
  54. package/dist/utils/path.js.map +1 -0
  55. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO;AACP,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,OAAsB;IAEtB,IAAI,OAAe,CAAC;IAEpB,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM;QACR,KAAK,MAAM;YACT,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM;QACR,KAAK,MAAM;YACT,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,gBAAgB,CAAC,MAA+B;IAC9D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Conversation, ExportOptions } from '../models/types.js';
2
+ export declare function exportToJson(conversation: Conversation, options: ExportOptions): string;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/exporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAkC,MAAM,oBAAoB,CAAC;AAWtG,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAyCvF"}
@@ -0,0 +1,45 @@
1
+ // 过滤内容块类型
2
+ function filterContentBlocks(content, excludeTypes) {
3
+ return content.filter(block => !excludeTypes.includes(block.type));
4
+ }
5
+ // 导出为JSON格式
6
+ export function exportToJson(conversation, options) {
7
+ // 深拷贝消息以避免修改原始数据
8
+ const filteredMessages = conversation.messages
9
+ .filter(m => m.type === 'user' || m.type === 'assistant')
10
+ .map(m => {
11
+ if (m.type !== 'assistant')
12
+ return m;
13
+ const assistantMsg = m;
14
+ const excludeTypes = [];
15
+ if (!options.includeThinking)
16
+ excludeTypes.push('thinking');
17
+ if (!options.includeToolCalls)
18
+ excludeTypes.push('tool_use');
19
+ if (excludeTypes.length === 0)
20
+ return m;
21
+ return {
22
+ ...assistantMsg,
23
+ message: {
24
+ ...assistantMsg.message,
25
+ content: filterContentBlocks(assistantMsg.message.content, excludeTypes),
26
+ },
27
+ };
28
+ });
29
+ const output = {
30
+ sessionId: conversation.sessionId,
31
+ slug: conversation.slug,
32
+ projectPath: conversation.projectPath,
33
+ startTime: conversation.startTime.toISOString(),
34
+ endTime: conversation.endTime.toISOString(),
35
+ messageCount: conversation.messageCount,
36
+ totalTokens: conversation.totalTokens,
37
+ messages: filteredMessages,
38
+ };
39
+ // 包含子代理对话
40
+ if (options.includeSubagents && conversation.subagents.length > 0) {
41
+ output.subagents = conversation.subagents;
42
+ }
43
+ return JSON.stringify(output, null, 2);
44
+ }
45
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/exporters/json.ts"],"names":[],"mappings":"AAEA,UAAU;AACV,SAAS,mBAAmB,CAC1B,OAAuB,EACvB,YAAsB;IAEtB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,YAAY,CAAC,YAA0B,EAAE,OAAsB;IAC7E,iBAAiB;IACjB,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ;SAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;SACxD,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,CAAqB,CAAC;QAC3C,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,CAAC,eAAe;YAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,gBAAgB;YAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAExC,OAAO;YACL,GAAG,YAAY;YACf,OAAO,EAAE;gBACP,GAAG,YAAY,CAAC,OAAO;gBACvB,OAAO,EAAE,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;aACzE;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE;QAC/C,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE;QAC3C,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,QAAQ,EAAE,gBAAgB;KAC3B,CAAC;IAEF,UAAU;IACV,IAAI,OAAO,CAAC,gBAAgB,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Conversation, ExportOptions } from '../models/types.js';
2
+ export declare function exportToMarkdown(conversation: Conversation, options: ExportOptions): string;
3
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/exporters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAIZ,aAAa,EACd,MAAM,oBAAoB,CAAC;AAU5B,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAgD3F"}
@@ -0,0 +1,87 @@
1
+ import { formatDateTime, formatTokens, extractTextContent, extractThinking, extractToolCalls, } from '../utils/format.js';
2
+ // 导出为Markdown格式
3
+ export function exportToMarkdown(conversation, options) {
4
+ const lines = [];
5
+ // 标题和元数据
6
+ lines.push(`# ${conversation.slug || conversation.sessionId}`);
7
+ lines.push('');
8
+ lines.push(`> **Project**: ${conversation.projectPath}`);
9
+ lines.push(`> **Session ID**: ${conversation.sessionId}`);
10
+ lines.push(`> **Time**: ${formatDateTime(conversation.startTime)} - ${formatDateTime(conversation.endTime)}`);
11
+ lines.push(`> **Messages**: ${conversation.messageCount}`);
12
+ lines.push(`> **Tokens**: Input ${formatTokens(conversation.totalTokens.input_tokens)} / Output ${formatTokens(conversation.totalTokens.output_tokens)}`);
13
+ lines.push('');
14
+ lines.push('---');
15
+ lines.push('');
16
+ // 消息列表
17
+ const messages = conversation.messages.filter(m => m.type === 'user' || m.type === 'assistant');
18
+ for (const message of messages) {
19
+ lines.push(formatMessage(message, options));
20
+ lines.push('');
21
+ }
22
+ // 子代理对话
23
+ if (options.includeSubagents && conversation.subagents.length > 0) {
24
+ lines.push('---');
25
+ lines.push('');
26
+ lines.push('## Subagent Conversations');
27
+ lines.push('');
28
+ for (const subagent of conversation.subagents) {
29
+ lines.push(`### Agent: ${subagent.agentId}`);
30
+ lines.push('');
31
+ const subMessages = subagent.messages.filter(m => m.type === 'user' || m.type === 'assistant');
32
+ for (const message of subMessages) {
33
+ lines.push(formatMessage(message, options));
34
+ lines.push('');
35
+ }
36
+ }
37
+ }
38
+ return lines.join('\n');
39
+ }
40
+ // 格式化单条消息
41
+ function formatMessage(message, options) {
42
+ const lines = [];
43
+ const timestamp = formatDateTime(message.timestamp);
44
+ const role = message.type === 'user' ? 'User' : 'Assistant';
45
+ lines.push(`### ${role} (${timestamp})`);
46
+ lines.push('');
47
+ // 思考过程
48
+ if (options.includeThinking && message.type === 'assistant') {
49
+ const thinkings = extractThinking(message);
50
+ if (thinkings.length > 0) {
51
+ lines.push('<details>');
52
+ lines.push('<summary>Thinking</summary>');
53
+ lines.push('');
54
+ for (const thinking of thinkings) {
55
+ lines.push('```');
56
+ lines.push(thinking);
57
+ lines.push('```');
58
+ lines.push('');
59
+ }
60
+ lines.push('</details>');
61
+ lines.push('');
62
+ }
63
+ }
64
+ // 工具调用
65
+ if (options.includeToolCalls && message.type === 'assistant') {
66
+ const toolCalls = extractToolCalls(message);
67
+ if (toolCalls.length > 0) {
68
+ for (const tool of toolCalls) {
69
+ lines.push(`<details>`);
70
+ lines.push(`<summary>Tool: ${tool.name}</summary>`);
71
+ lines.push('');
72
+ lines.push('```json');
73
+ lines.push(JSON.stringify(tool.input, null, 2));
74
+ lines.push('```');
75
+ lines.push('</details>');
76
+ lines.push('');
77
+ }
78
+ }
79
+ }
80
+ // 文本内容
81
+ const textContent = extractTextContent(message);
82
+ if (textContent) {
83
+ lines.push(textContent);
84
+ }
85
+ return lines.join('\n');
86
+ }
87
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/exporters/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { program } from './cli.js';
3
+ import { runInteractive } from './interactive.js';
4
+ async function main() {
5
+ // 如果没有子命令,进入交互式模式
6
+ if (process.argv.length <= 2) {
7
+ await runInteractive();
8
+ }
9
+ else {
10
+ program.parse();
11
+ }
12
+ }
13
+ main().catch(console.error);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,kBAAkB;IAClB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runInteractive(): Promise<void>;
2
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAqBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCpD"}
@@ -0,0 +1,348 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { scanProjects } from './core/scanner.js';
5
+ import { parseConversation } from './core/parser.js';
6
+ import { exportConversation, getFileExtension } from './exporters/index.js';
7
+ import { formatDateTime, formatSize, truncate, extractTextContent } from './utils/format.js';
8
+ // 主菜单选项
9
+ const MAIN_MENU_CHOICES = [
10
+ { name: '📁 Browse Projects', value: 'browse' },
11
+ { name: '🔍 Search Conversations', value: 'search' },
12
+ { name: '📊 View Statistics', value: 'stats' },
13
+ { name: '❌ Exit', value: 'exit' },
14
+ ];
15
+ // 交互式主程序
16
+ export async function runInteractive() {
17
+ console.log();
18
+ console.log(chalk.bold.cyan('╔══════════════════════════════════════╗'));
19
+ console.log(chalk.bold.cyan('║ Claude Code Exporter v1.0.0 ║'));
20
+ console.log(chalk.bold.cyan('╚══════════════════════════════════════╝'));
21
+ console.log();
22
+ while (true) {
23
+ const { action } = await inquirer.prompt([
24
+ {
25
+ type: 'list',
26
+ name: 'action',
27
+ message: 'What would you like to do?',
28
+ choices: MAIN_MENU_CHOICES,
29
+ },
30
+ ]);
31
+ switch (action) {
32
+ case 'browse':
33
+ await browseProjects();
34
+ break;
35
+ case 'search':
36
+ await searchConversations();
37
+ break;
38
+ case 'stats':
39
+ await showStatistics();
40
+ break;
41
+ case 'exit':
42
+ console.log(chalk.gray('\nGoodbye!'));
43
+ return;
44
+ }
45
+ }
46
+ }
47
+ // 浏览项目
48
+ async function browseProjects() {
49
+ const spinner = ora('Loading projects...').start();
50
+ const result = await scanProjects();
51
+ spinner.stop();
52
+ if (result.projects.length === 0) {
53
+ console.log(chalk.yellow('\nNo projects found.\n'));
54
+ return 'back';
55
+ }
56
+ const choices = result.projects.map(p => ({
57
+ name: `${p.name} (${p.totalConversations} conversations)`,
58
+ value: p,
59
+ }));
60
+ choices.push({ name: chalk.gray('← Back'), value: null });
61
+ const { project } = await inquirer.prompt([
62
+ {
63
+ type: 'list',
64
+ name: 'project',
65
+ message: 'Select a project:',
66
+ choices,
67
+ pageSize: 15,
68
+ },
69
+ ]);
70
+ if (project) {
71
+ return await browseConversations(project);
72
+ }
73
+ return 'back';
74
+ }
75
+ // 浏览对话
76
+ async function browseConversations(project) {
77
+ while (true) {
78
+ const choices = project.conversations.map(c => ({
79
+ name: `${formatDateTime(c.startTime)} - ${c.slug || c.sessionId.slice(0, 8)} (${c.messageCount} msgs)`,
80
+ value: c,
81
+ }));
82
+ choices.push({ name: chalk.gray('← Back'), value: null });
83
+ choices.push({ name: chalk.cyan('🏠 Main Menu'), value: 'main' });
84
+ console.log();
85
+ console.log(chalk.bold.blue(`📁 ${project.name}`));
86
+ console.log(chalk.gray(` ${project.originalPath}`));
87
+ console.log();
88
+ const { conversation } = await inquirer.prompt([
89
+ {
90
+ type: 'list',
91
+ name: 'conversation',
92
+ message: 'Select a conversation:',
93
+ choices,
94
+ pageSize: 15,
95
+ },
96
+ ]);
97
+ if (conversation === 'main') {
98
+ return 'main';
99
+ }
100
+ if (!conversation) {
101
+ return 'back';
102
+ }
103
+ const result = await showConversationActions(project, conversation);
104
+ if (result === 'main') {
105
+ return 'main';
106
+ }
107
+ // result === 'back' 时继续循环显示对话列表
108
+ // result === 'continue' 时也继续循环(用于查看信息后)
109
+ }
110
+ }
111
+ // 对话操作菜单
112
+ async function showConversationActions(project, conversationSummary) {
113
+ const spinner = ora('Loading conversation...').start();
114
+ const conversation = await parseConversation(conversationSummary.filePath, project.originalPath);
115
+ spinner.stop();
116
+ const { action } = await inquirer.prompt([
117
+ {
118
+ type: 'list',
119
+ name: 'action',
120
+ message: `Conversation: ${conversation.slug || conversation.sessionId.slice(0, 8)}`,
121
+ choices: [
122
+ { name: '👁️ Preview', value: 'preview' },
123
+ { name: '📤 Export', value: 'export' },
124
+ { name: '📋 Show Info', value: 'info' },
125
+ { name: chalk.gray('← Back'), value: 'back' },
126
+ { name: chalk.cyan('🏠 Main Menu'), value: 'main' },
127
+ ],
128
+ },
129
+ ]);
130
+ switch (action) {
131
+ case 'preview':
132
+ await previewConversation(conversation);
133
+ return 'back';
134
+ case 'export':
135
+ await exportConversationPrompt(conversation);
136
+ return 'back';
137
+ case 'info':
138
+ showConversationInfo(conversation);
139
+ return 'continue';
140
+ case 'main':
141
+ return 'main';
142
+ case 'back':
143
+ default:
144
+ return 'back';
145
+ }
146
+ }
147
+ // 预览对话
148
+ async function previewConversation(conversation) {
149
+ const messages = conversation.messages.filter(m => m.type === 'user' || m.type === 'assistant');
150
+ console.log();
151
+ console.log(chalk.bold('─'.repeat(60)));
152
+ console.log(chalk.bold(`Preview: ${conversation.slug || conversation.sessionId.slice(0, 8)}`));
153
+ console.log(chalk.bold('─'.repeat(60)));
154
+ console.log();
155
+ // 显示前10条消息
156
+ const previewCount = Math.min(10, messages.length);
157
+ for (let i = 0; i < previewCount; i++) {
158
+ const msg = messages[i];
159
+ const role = msg.type === 'user' ? chalk.blue('User') : chalk.green('Assistant');
160
+ const content = truncate(extractTextContent(msg), 200);
161
+ console.log(`${role}:`);
162
+ console.log(chalk.gray(content));
163
+ console.log();
164
+ }
165
+ if (messages.length > previewCount) {
166
+ console.log(chalk.gray(`... and ${messages.length - previewCount} more messages`));
167
+ }
168
+ console.log(chalk.bold('─'.repeat(60)));
169
+ console.log();
170
+ await inquirer.prompt([
171
+ {
172
+ type: 'input',
173
+ name: 'continue',
174
+ message: 'Press Enter to continue...',
175
+ },
176
+ ]);
177
+ }
178
+ // 导出对话提示
179
+ async function exportConversationPrompt(conversation) {
180
+ const { format } = await inquirer.prompt([
181
+ {
182
+ type: 'list',
183
+ name: 'format',
184
+ message: 'Select export format:',
185
+ choices: [
186
+ { name: 'Markdown (.md)', value: 'markdown' },
187
+ { name: 'JSON (.json)', value: 'json' },
188
+ { name: 'HTML (.html)', value: 'html' },
189
+ ],
190
+ },
191
+ ]);
192
+ const { options } = await inquirer.prompt([
193
+ {
194
+ type: 'checkbox',
195
+ name: 'options',
196
+ message: 'Export options:',
197
+ choices: [
198
+ { name: 'Include thinking blocks', value: 'thinking', checked: true },
199
+ { name: 'Include tool calls', value: 'tools', checked: true },
200
+ { name: 'Include subagent conversations', value: 'subagents', checked: false },
201
+ ],
202
+ },
203
+ ]);
204
+ const defaultName = `${conversation.slug || conversation.sessionId}${getFileExtension(format)}`;
205
+ const { outputPath } = await inquirer.prompt([
206
+ {
207
+ type: 'input',
208
+ name: 'outputPath',
209
+ message: 'Output file path:',
210
+ default: defaultName,
211
+ },
212
+ ]);
213
+ const spinner = ora('Exporting...').start();
214
+ try {
215
+ const exportOptions = {
216
+ format,
217
+ includeThinking: options.includes('thinking'),
218
+ includeToolCalls: options.includes('tools'),
219
+ includeSubagents: options.includes('subagents'),
220
+ outputPath,
221
+ };
222
+ await exportConversation(conversation, exportOptions);
223
+ spinner.succeed(`Exported to ${chalk.green(outputPath)}`);
224
+ }
225
+ catch (error) {
226
+ spinner.fail('Export failed');
227
+ console.error(chalk.red(error.message));
228
+ }
229
+ console.log();
230
+ }
231
+ // 显示对话信息
232
+ function showConversationInfo(conversation) {
233
+ console.log();
234
+ console.log(chalk.bold('─'.repeat(60)));
235
+ console.log(chalk.bold('Conversation Info'));
236
+ console.log(chalk.bold('─'.repeat(60)));
237
+ console.log();
238
+ console.log(`${chalk.gray('Slug:')} ${conversation.slug || '-'}`);
239
+ console.log(`${chalk.gray('Session:')} ${conversation.sessionId}`);
240
+ console.log(`${chalk.gray('Project:')} ${conversation.projectPath}`);
241
+ console.log(`${chalk.gray('Start:')} ${formatDateTime(conversation.startTime)}`);
242
+ console.log(`${chalk.gray('End:')} ${formatDateTime(conversation.endTime)}`);
243
+ console.log(`${chalk.gray('Messages:')} ${conversation.messageCount}`);
244
+ console.log(`${chalk.gray('Tokens:')} In: ${conversation.totalTokens.input_tokens} / Out: ${conversation.totalTokens.output_tokens}`);
245
+ console.log(`${chalk.gray('Subagents:')} ${conversation.subagents.length}`);
246
+ if (conversation.subagents.length > 0) {
247
+ console.log();
248
+ console.log(chalk.gray('Subagent details:'));
249
+ for (const sub of conversation.subagents) {
250
+ console.log(` - ${sub.agentId}: ${sub.messageCount} messages`);
251
+ }
252
+ }
253
+ console.log();
254
+ console.log(chalk.bold('─'.repeat(60)));
255
+ console.log();
256
+ }
257
+ // 搜索对话
258
+ async function searchConversations() {
259
+ const { keyword } = await inquirer.prompt([
260
+ {
261
+ type: 'input',
262
+ name: 'keyword',
263
+ message: 'Enter search keyword (project name or session ID):',
264
+ },
265
+ ]);
266
+ if (!keyword.trim()) {
267
+ return 'back';
268
+ }
269
+ const spinner = ora('Searching...').start();
270
+ const result = await scanProjects();
271
+ spinner.stop();
272
+ // 搜索匹配的对话
273
+ const matches = [];
274
+ for (const project of result.projects) {
275
+ if (project.name.toLowerCase().includes(keyword.toLowerCase()) ||
276
+ project.originalPath.toLowerCase().includes(keyword.toLowerCase())) {
277
+ for (const conv of project.conversations) {
278
+ matches.push({ project, conversation: conv });
279
+ }
280
+ }
281
+ else {
282
+ for (const conv of project.conversations) {
283
+ if (conv.sessionId.includes(keyword) ||
284
+ (conv.slug && conv.slug.toLowerCase().includes(keyword.toLowerCase()))) {
285
+ matches.push({ project, conversation: conv });
286
+ }
287
+ }
288
+ }
289
+ }
290
+ if (matches.length === 0) {
291
+ console.log(chalk.yellow(`\nNo conversations found matching "${keyword}"\n`));
292
+ return 'back';
293
+ }
294
+ console.log(chalk.green(`\nFound ${matches.length} matches:\n`));
295
+ const choices = matches.slice(0, 30).map(m => ({
296
+ name: `[${m.project.name}] ${formatDateTime(m.conversation.startTime)} - ${m.conversation.slug || m.conversation.sessionId.slice(0, 8)}`,
297
+ value: m,
298
+ }));
299
+ choices.push({ name: chalk.gray('← Back'), value: null });
300
+ const { selected } = await inquirer.prompt([
301
+ {
302
+ type: 'list',
303
+ name: 'selected',
304
+ message: 'Select a conversation:',
305
+ choices,
306
+ pageSize: 15,
307
+ },
308
+ ]);
309
+ if (selected) {
310
+ return await showConversationActions(selected.project, selected.conversation);
311
+ }
312
+ return 'back';
313
+ }
314
+ // 显示统计
315
+ async function showStatistics() {
316
+ const spinner = ora('Calculating statistics...').start();
317
+ const result = await scanProjects();
318
+ spinner.stop();
319
+ console.log();
320
+ console.log(chalk.bold('─'.repeat(60)));
321
+ console.log(chalk.bold('📊 Statistics'));
322
+ console.log(chalk.bold('─'.repeat(60)));
323
+ console.log();
324
+ console.log(`${chalk.gray('Total Projects:')} ${chalk.cyan(result.projects.length)}`);
325
+ console.log(`${chalk.gray('Total Conversations:')} ${chalk.cyan(result.totalConversations)}`);
326
+ console.log(`${chalk.gray('Total Size:')} ${chalk.cyan(formatSize(result.totalSize))}`);
327
+ console.log();
328
+ // Top 10 项目
329
+ console.log(chalk.bold('Top 10 Projects by Size:'));
330
+ console.log();
331
+ const sorted = [...result.projects].sort((a, b) => b.totalSize - a.totalSize).slice(0, 10);
332
+ for (let i = 0; i < sorted.length; i++) {
333
+ const p = sorted[i];
334
+ const bar = '█'.repeat(Math.ceil((p.totalSize / result.totalSize) * 30));
335
+ console.log(` ${(i + 1).toString().padStart(2)}. ${p.name.slice(0, 25).padEnd(25)} ${formatSize(p.totalSize).padStart(10)} ${chalk.blue(bar)}`);
336
+ }
337
+ console.log();
338
+ console.log(chalk.bold('─'.repeat(60)));
339
+ console.log();
340
+ await inquirer.prompt([
341
+ {
342
+ type: 'input',
343
+ name: 'continue',
344
+ message: 'Press Enter to continue...',
345
+ },
346
+ ]);
347
+ }
348
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}