@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,158 @@
1
+ export type MessageType = 'user' | 'assistant' | 'file-history-snapshot' | 'summary';
2
+ export interface TokenUsage {
3
+ input_tokens: number;
4
+ output_tokens: number;
5
+ cache_creation_input_tokens?: number;
6
+ cache_read_input_tokens?: number;
7
+ }
8
+ export interface ThinkingBlock {
9
+ type: 'thinking';
10
+ thinking: string;
11
+ signature?: string;
12
+ }
13
+ export interface TextBlock {
14
+ type: 'text';
15
+ text: string;
16
+ }
17
+ export interface ToolUseBlock {
18
+ type: 'tool_use';
19
+ id: string;
20
+ name: string;
21
+ input: Record<string, unknown>;
22
+ }
23
+ export interface ToolResultBlock {
24
+ type: 'tool_result';
25
+ tool_use_id: string;
26
+ content: string | ContentBlock[];
27
+ }
28
+ export type ContentBlock = ThinkingBlock | TextBlock | ToolUseBlock | ToolResultBlock;
29
+ export interface UserMessageContent {
30
+ role: 'user';
31
+ content: string | ContentBlock[];
32
+ }
33
+ export interface AssistantMessageContent {
34
+ role: 'assistant';
35
+ content: ContentBlock[];
36
+ id?: string;
37
+ model?: string;
38
+ stop_reason?: string | null;
39
+ type?: string;
40
+ usage?: TokenUsage;
41
+ }
42
+ export interface UserMessage {
43
+ type: 'user';
44
+ uuid: string;
45
+ parentUuid: string | null;
46
+ timestamp: string;
47
+ sessionId: string;
48
+ cwd: string;
49
+ gitBranch?: string;
50
+ slug?: string;
51
+ version?: string;
52
+ userType?: string;
53
+ isSidechain: boolean;
54
+ message: UserMessageContent;
55
+ todos?: Todo[];
56
+ thinkingMetadata?: {
57
+ level: string;
58
+ disabled: boolean;
59
+ triggers: string[];
60
+ };
61
+ }
62
+ export interface AssistantMessage {
63
+ type: 'assistant';
64
+ uuid: string;
65
+ parentUuid: string;
66
+ timestamp: string;
67
+ isSidechain: boolean;
68
+ message: AssistantMessageContent;
69
+ agentId?: string;
70
+ }
71
+ export interface FileHistorySnapshot {
72
+ type: 'file-history-snapshot';
73
+ messageId: string;
74
+ snapshot: {
75
+ messageId: string;
76
+ trackedFileBackups: Record<string, unknown>;
77
+ timestamp: string;
78
+ };
79
+ isSnapshotUpdate: boolean;
80
+ }
81
+ export interface SummaryMessage {
82
+ type: 'summary';
83
+ uuid: string;
84
+ parentUuid: string;
85
+ timestamp: string;
86
+ summary: string;
87
+ leafUuid: string;
88
+ }
89
+ export interface Todo {
90
+ content: string;
91
+ status: 'pending' | 'in_progress' | 'completed';
92
+ activeForm?: string;
93
+ }
94
+ export type MessageRecord = UserMessage | AssistantMessage | FileHistorySnapshot | SummaryMessage;
95
+ export interface Conversation {
96
+ sessionId: string;
97
+ slug?: string;
98
+ projectPath: string;
99
+ filePath: string;
100
+ messages: MessageRecord[];
101
+ subagents: SubagentConversation[];
102
+ startTime: Date;
103
+ endTime: Date;
104
+ messageCount: number;
105
+ totalTokens: TokenUsage;
106
+ }
107
+ export interface SubagentConversation {
108
+ agentId: string;
109
+ filePath: string;
110
+ messages: MessageRecord[];
111
+ messageCount: number;
112
+ }
113
+ export interface Project {
114
+ name: string;
115
+ encodedPath: string;
116
+ originalPath: string;
117
+ dirPath: string;
118
+ conversations: ConversationSummary[];
119
+ totalConversations: number;
120
+ totalSize: number;
121
+ }
122
+ export interface ConversationSummary {
123
+ sessionId: string;
124
+ slug?: string;
125
+ filePath: string;
126
+ startTime: Date;
127
+ endTime: Date;
128
+ messageCount: number;
129
+ fileSize: number;
130
+ hasSubagents: boolean;
131
+ }
132
+ export interface ScanResult {
133
+ projects: Project[];
134
+ totalConversations: number;
135
+ totalSize: number;
136
+ }
137
+ export interface ExportOptions {
138
+ format: 'markdown' | 'json' | 'html';
139
+ includeThinking: boolean;
140
+ includeToolCalls: boolean;
141
+ includeSubagents: boolean;
142
+ outputPath: string;
143
+ }
144
+ export interface Stats {
145
+ totalProjects: number;
146
+ totalConversations: number;
147
+ totalMessages: number;
148
+ totalTokens: TokenUsage;
149
+ projectStats: ProjectStats[];
150
+ }
151
+ export interface ProjectStats {
152
+ name: string;
153
+ conversationCount: number;
154
+ messageCount: number;
155
+ tokens: TokenUsage;
156
+ size: number;
157
+ }
158
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { MessageRecord, ToolUseBlock, ToolResultBlock } from '../models/types.js';
2
+ export declare function formatDateTime(date: Date | string): string;
3
+ export declare function formatDate(date: Date | string): string;
4
+ export declare function formatSize(bytes: number): string;
5
+ export declare function formatTokens(count: number): string;
6
+ export declare function extractTextContent(message: MessageRecord): string;
7
+ export declare function extractThinking(message: MessageRecord): string[];
8
+ export declare function extractToolCalls(message: MessageRecord): ToolUseBlock[];
9
+ export declare function extractToolResults(message: MessageRecord): ToolResultBlock[];
10
+ export declare function truncate(text: string, maxLength?: number): string;
11
+ export declare function escapeHtml(text: string): string;
12
+ export declare function escapeMarkdown(text: string): string;
13
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAMb,YAAY,EACZ,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAG5B,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAE1D;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAEtD;AAGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAyBjE;AAGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,CAUhE;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE,CAQvE;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,EAAE,CAQ5E;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAGtE;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,104 @@
1
+ import dayjs from 'dayjs';
2
+ // 格式化日期时间
3
+ export function formatDateTime(date) {
4
+ return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
5
+ }
6
+ // 格式化日期
7
+ export function formatDate(date) {
8
+ return dayjs(date).format('YYYY-MM-DD');
9
+ }
10
+ // 格式化文件大小
11
+ export function formatSize(bytes) {
12
+ if (bytes < 1024)
13
+ return `${bytes} B`;
14
+ if (bytes < 1024 * 1024)
15
+ return `${(bytes / 1024).toFixed(1)} KB`;
16
+ if (bytes < 1024 * 1024 * 1024)
17
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
18
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
19
+ }
20
+ // 格式化token数量
21
+ export function formatTokens(count) {
22
+ if (count < 1000)
23
+ return count.toString();
24
+ if (count < 1000000)
25
+ return `${(count / 1000).toFixed(1)}K`;
26
+ return `${(count / 1000000).toFixed(2)}M`;
27
+ }
28
+ // 提取消息文本内容
29
+ export function extractTextContent(message) {
30
+ if (message.type === 'user') {
31
+ const userMsg = message;
32
+ const content = userMsg.message.content;
33
+ if (typeof content === 'string') {
34
+ return content;
35
+ }
36
+ return content
37
+ .filter((block) => block.type === 'text')
38
+ .map(block => block.text)
39
+ .join('\n');
40
+ }
41
+ if (message.type === 'assistant') {
42
+ const assistantMsg = message;
43
+ const content = assistantMsg.message.content;
44
+ if (!Array.isArray(content))
45
+ return '';
46
+ return content
47
+ .filter((block) => block.type === 'text')
48
+ .map(block => block.text)
49
+ .join('\n');
50
+ }
51
+ return '';
52
+ }
53
+ // 提取思考内容
54
+ export function extractThinking(message) {
55
+ if (message.type !== 'assistant')
56
+ return [];
57
+ const assistantMsg = message;
58
+ const content = assistantMsg.message.content;
59
+ if (!Array.isArray(content))
60
+ return [];
61
+ return content
62
+ .filter((block) => block.type === 'thinking')
63
+ .map(block => block.thinking);
64
+ }
65
+ // 提取工具调用
66
+ export function extractToolCalls(message) {
67
+ if (message.type !== 'assistant')
68
+ return [];
69
+ const assistantMsg = message;
70
+ const content = assistantMsg.message.content;
71
+ if (!Array.isArray(content))
72
+ return [];
73
+ return content.filter((block) => block.type === 'tool_use');
74
+ }
75
+ // 提取工具结果
76
+ export function extractToolResults(message) {
77
+ if (message.type !== 'user')
78
+ return [];
79
+ const userMsg = message;
80
+ const content = userMsg.message.content;
81
+ if (typeof content === 'string')
82
+ return [];
83
+ return content.filter((block) => block.type === 'tool_result');
84
+ }
85
+ // 截断文本
86
+ export function truncate(text, maxLength = 100) {
87
+ if (text.length <= maxLength)
88
+ return text;
89
+ return text.slice(0, maxLength - 3) + '...';
90
+ }
91
+ // 转义HTML特殊字符
92
+ export function escapeHtml(text) {
93
+ return text
94
+ .replace(/&/g, '&amp;')
95
+ .replace(/</g, '&lt;')
96
+ .replace(/>/g, '&gt;')
97
+ .replace(/"/g, '&quot;')
98
+ .replace(/'/g, '&#039;');
99
+ }
100
+ // 转义Markdown特殊字符
101
+ export function escapeMarkdown(text) {
102
+ return text.replace(/([\\`*_{}[\]()#+\-.!])/g, '\\$1');
103
+ }
104
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const CLAUDE_DIR: string;
2
+ export declare const PROJECTS_DIR: string;
3
+ export declare const HISTORY_FILE: string;
4
+ export declare function decodePath(encodedPath: string): string;
5
+ export declare function encodePath(originalPath: string): string;
6
+ export declare function getProjectName(encodedPath: string): string;
7
+ export declare function isJsonlFile(filename: string): boolean;
8
+ export declare function isUUID(str: string): boolean;
9
+ export declare function extractSessionId(filename: string): string | null;
10
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAA6B,CAAC;AACrD,eAAO,MAAM,YAAY,QAA+B,CAAC;AACzD,eAAO,MAAM,YAAY,QAAoC,CAAC;AAI9D,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGtD;AAID,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEvD;AAGD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG1D;AAGD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAGD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG3C;AAGD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE"}
@@ -0,0 +1,37 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ // Claude数据目录
4
+ export const CLAUDE_DIR = join(homedir(), '.claude');
5
+ export const PROJECTS_DIR = join(CLAUDE_DIR, 'projects');
6
+ export const HISTORY_FILE = join(CLAUDE_DIR, 'history.jsonl');
7
+ // 将编码路径解码为原始路径
8
+ // 例如: -Users-chen-Repository-cc-exporter -> /Users/chen/Repository/cc-exporter
9
+ export function decodePath(encodedPath) {
10
+ // 移除开头的连字符,然后用/替换所有连字符
11
+ return '/' + encodedPath.slice(1).replace(/-/g, '/');
12
+ }
13
+ // 将原始路径编码为目录名
14
+ // 例如: /Users/chen/Repository/cc-exporter -> -Users-chen-Repository-cc-exporter
15
+ export function encodePath(originalPath) {
16
+ return originalPath.replace(/\//g, '-');
17
+ }
18
+ // 从编码路径中提取项目名称(最后一段)
19
+ export function getProjectName(encodedPath) {
20
+ const parts = encodedPath.split('-').filter(Boolean);
21
+ return parts[parts.length - 1] || encodedPath;
22
+ }
23
+ // 判断是否为JSONL文件
24
+ export function isJsonlFile(filename) {
25
+ return filename.endsWith('.jsonl');
26
+ }
27
+ // 判断是否为UUID格式
28
+ export function isUUID(str) {
29
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
30
+ return uuidRegex.test(str);
31
+ }
32
+ // 从文件名提取sessionId
33
+ export function extractSessionId(filename) {
34
+ const name = filename.replace('.jsonl', '');
35
+ return isUUID(name) ? name : null;
36
+ }
37
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,aAAa;AACb,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAE9D,eAAe;AACf,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,uBAAuB;IACvB,OAAO,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,cAAc;AACd,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC7C,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;AAChD,CAAC;AAED,eAAe;AACf,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,cAAc;AACd,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,MAAM,SAAS,GAAG,iEAAiE,CAAC;IACpF,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@vamdawn/cconvo",
3
+ "version": "1.0.0",
4
+ "description": "Interactive CLI tool to browse and export Claude Code conversations",
5
+ "main": "dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "bin": {
8
+ "cconvo": "dist/index.js"
9
+ },
10
+ "type": "module",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsx src/index.ts",
24
+ "start": "node dist/index.js",
25
+ "lint": "eslint src",
26
+ "typecheck": "tsc --noEmit",
27
+ "prepublishOnly": "pnpm build && pnpm typecheck"
28
+ },
29
+ "keywords": [
30
+ "claude",
31
+ "cli",
32
+ "exporter",
33
+ "conversation"
34
+ ],
35
+ "author": "vamdawn <vamdawn@outlook.com>",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/Vamdawn/cconvo.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/Vamdawn/cconvo/issues"
43
+ },
44
+ "homepage": "https://github.com/Vamdawn/cconvo#readme",
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "dependencies": {
49
+ "chalk": "^5.3.0",
50
+ "cli-table3": "^0.6.5",
51
+ "commander": "^12.1.0",
52
+ "dayjs": "^1.11.13",
53
+ "handlebars": "^4.7.8",
54
+ "inquirer": "^12.3.0",
55
+ "ora": "^8.1.1"
56
+ },
57
+ "devDependencies": {
58
+ "@types/inquirer": "^9.0.7",
59
+ "@types/node": "^22.10.5",
60
+ "tsx": "^4.19.2",
61
+ "typescript": "^5.7.3"
62
+ },
63
+ "engines": {
64
+ "node": ">=18.0.0"
65
+ }
66
+ }