@shepai/cli 1.121.0-pr388.bf8e9d3 → 1.121.0-pr391.c78e14b

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 (191) hide show
  1. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts +3 -1
  2. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +4 -2
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts +21 -0
  5. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.js +71 -0
  7. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +11 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +34 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +18 -6
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.js +4 -1
  15. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -0
  16. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +20 -1
  18. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  19. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +2 -43
  20. package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -1
  21. package/dist/src/presentation/web/app/actions/approve-feature.js +9 -0
  22. package/dist/src/presentation/web/app/actions/reject-feature.d.ts.map +1 -1
  23. package/dist/src/presentation/web/app/actions/reject-feature.js +9 -0
  24. package/dist/src/presentation/web/app/api/npm-version/route.d.ts.map +1 -1
  25. package/dist/src/presentation/web/app/api/npm-version/route.js +9 -1
  26. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -1
  27. package/dist/src/presentation/web/app/api/sessions/route.js +43 -10
  28. package/dist/tsconfig.build.tsbuildinfo +1 -1
  29. package/package.json +3 -5
  30. package/web/.next/BUILD_ID +1 -1
  31. package/web/.next/build-manifest.json +2 -2
  32. package/web/.next/fallback-build-manifest.json +2 -2
  33. package/web/.next/prerender-manifest.json +3 -3
  34. package/web/.next/required-server-files.js +1 -1
  35. package/web/.next/required-server-files.json +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  37. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  51. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  62. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  65. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/_global-error.html +2 -2
  68. package/web/.next/server/app/_global-error.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  74. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  75. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/api/sessions/route.js +1 -1
  77. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  78. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  79. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  80. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  82. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  84. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  86. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  88. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  89. package/web/.next/server/chunks/[externals]_node:fs_ddf6f167._.js +3 -0
  90. package/web/.next/server/chunks/[externals]_node:fs_ddf6f167._.js.map +1 -0
  91. package/web/.next/server/chunks/[root-of-the-server]__3b72e8b0._.js +1 -1
  92. package/web/.next/server/chunks/[root-of-the-server]__3b72e8b0._.js.map +1 -1
  93. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +1 -1
  94. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -1
  95. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  96. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js +3 -0
  97. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js.map +1 -0
  98. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  99. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  101. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  103. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  105. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js +3 -0
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +1 -0
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js +3 -0
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +2 -2
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js +3 -0
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +1 -0
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js +3 -0
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +1 -0
  129. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  132. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  134. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/{_303403cc._.js → _bab62fc0._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{_303403cc._.js.map → _bab62fc0._.js.map} +1 -1
  137. package/web/.next/server/chunks/ssr/_c56ec6a7._.js +3 -0
  138. package/web/.next/server/chunks/ssr/{_6b5db2f2._.js.map → _c56ec6a7._.js.map} +1 -1
  139. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/{_4fde7610._.js → _f7380711._.js} +2 -2
  142. package/web/.next/server/chunks/ssr/{_4fde7610._.js.map → _f7380711._.js.map} +1 -1
  143. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  144. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  146. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  148. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  154. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  163. package/web/.next/server/pages/500.html +2 -2
  164. package/web/.next/server/server-reference-manifest.js +1 -1
  165. package/web/.next/server/server-reference-manifest.json +34 -34
  166. package/web/.next/static/chunks/{408081750f6cbc07.js → 069b25904188166a.js} +2 -2
  167. package/web/.next/static/chunks/{da7c48510e6b163d.js → 13cfe539c3614462.js} +1 -1
  168. package/web/.next/static/chunks/{03fc1b9e03ba9c18.js → 3fa5bb266a4efd0b.js} +1 -1
  169. package/web/.next/static/chunks/{b53ebbfd7828a4ac.js → 55ba4f5f2c14bc6d.js} +1 -1
  170. package/web/.next/static/chunks/6bf868f1f2c9932a.js +1 -0
  171. package/web/.next/static/chunks/794e13829d777a43.js +1 -0
  172. package/web/.next/static/chunks/{a16d086483967fa5.js → 7fbb2a18e0290c04.js} +1 -1
  173. package/web/.next/static/chunks/{70e3bcb8b8c18483.js → 84afd37bdafaebd2.js} +1 -1
  174. package/web/.next/static/chunks/{10bb9c88a36edf3d.js → 946fb1bc0a185497.js} +1 -1
  175. package/web/.next/static/chunks/{0131909a6948f59a.js → e4e8be03b609cbb9.js} +1 -1
  176. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js +0 -3
  177. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js.map +0 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__0424e9ef._.js +0 -3
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__0424e9ef._.js.map +0 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__580db3b8._.js +0 -3
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__580db3b8._.js.map +0 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d1a30fb._.js +0 -3
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d1a30fb._.js.map +0 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__7e95570f._.js +0 -3
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__7e95570f._.js.map +0 -1
  186. package/web/.next/server/chunks/ssr/_6b5db2f2._.js +0 -3
  187. package/web/.next/static/chunks/00ca7625c98bf6f9.js +0 -1
  188. package/web/.next/static/chunks/68a9e7efac269284.js +0 -1
  189. /package/web/.next/static/{ccSdOV-lLaWhdVo9m_Y1J → KhUL5DyMrZ1T6n60ZVbAZ}/_buildManifest.js +0 -0
  190. /package/web/.next/static/{ccSdOV-lLaWhdVo9m_Y1J → KhUL5DyMrZ1T6n60ZVbAZ}/_clientMiddlewareManifest.json +0 -0
  191. /package/web/.next/static/{ccSdOV-lLaWhdVo9m_Y1J → KhUL5DyMrZ1T6n60ZVbAZ}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  import { NextResponse } from 'next/server';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
- import { readdir, stat, readFile } from 'node:fs/promises';
4
+ import { readdir, stat } from 'node:fs/promises';
5
5
  export const dynamic = 'force-dynamic';
6
6
  // ── Path encoding helpers ─────────────────────────────────────────────
7
7
  /**
@@ -49,14 +49,32 @@ async function scanClaudeSessions(repositoryPath, limit) {
49
49
  .map((r) => r.value)
50
50
  .filter((s) => s !== null);
51
51
  }
52
+ /**
53
+ * Read the first N bytes of a file to extract preview and timestamps
54
+ * without loading the entire (potentially multi-MB) session file.
55
+ */
56
+ const PREVIEW_READ_BYTES = 8_192; // 8KB is enough for first few messages
52
57
  async function parseClaudeSession(filePath, fileName, mtime, repositoryPath) {
53
- const content = await readFile(filePath, 'utf-8');
54
- const lines = content.split('\n').filter((l) => l.trim());
58
+ const { createReadStream } = await import('node:fs');
55
59
  const id = fileName.replace('.jsonl', '');
60
+ // Read only the first chunk to extract preview and first timestamp
56
61
  let preview = null;
57
- let messageCount = 0;
58
62
  let firstTimestamp = null;
59
- let lastTimestamp = null;
63
+ let messageCount = 0;
64
+ const head = await new Promise((resolve) => {
65
+ const chunks = [];
66
+ let size = 0;
67
+ const stream = createReadStream(filePath, { end: PREVIEW_READ_BYTES - 1 });
68
+ stream.on('data', (chunk) => {
69
+ chunks.push(chunk);
70
+ size += chunk.length;
71
+ });
72
+ stream.on('end', () => resolve(Buffer.concat(chunks, size).toString('utf-8')));
73
+ stream.on('error', () => resolve(''));
74
+ });
75
+ if (!head)
76
+ return null;
77
+ const lines = head.split('\n').filter((l) => l.trim());
60
78
  for (const line of lines) {
61
79
  try {
62
80
  const entry = JSON.parse(line);
@@ -66,7 +84,6 @@ async function parseClaudeSession(filePath, fileName, mtime, repositoryPath) {
66
84
  messageCount++;
67
85
  if (entry.timestamp) {
68
86
  firstTimestamp ??= entry.timestamp;
69
- lastTimestamp = entry.timestamp;
70
87
  }
71
88
  if (role === 'user' && preview === null) {
72
89
  preview = extractText(entry.message?.content);
@@ -80,14 +97,16 @@ async function parseClaudeSession(filePath, fileName, mtime, repositoryPath) {
80
97
  }
81
98
  if (messageCount === 0)
82
99
  return null;
100
+ // Use mtime as lastMessageAt — avoids reading entire file for last line
101
+ const mtimeIso = new Date(mtime).toISOString();
83
102
  return {
84
103
  id,
85
104
  agentType: 'claude-code',
86
105
  preview,
87
106
  messageCount,
88
107
  firstMessageAt: firstTimestamp,
89
- lastMessageAt: lastTimestamp,
90
- createdAt: firstTimestamp ?? new Date(mtime).toISOString(),
108
+ lastMessageAt: mtimeIso,
109
+ createdAt: firstTimestamp ?? mtimeIso,
91
110
  projectPath: repositoryPath,
92
111
  filePath,
93
112
  _mtime: mtime,
@@ -144,11 +163,25 @@ async function scanCursorSessions(repositoryPath, limit) {
144
163
  .filter((s) => s !== null);
145
164
  }
146
165
  async function parseCursorSession(filePath, fileName, mtime, repositoryPath) {
147
- const content = await readFile(filePath, 'utf-8');
148
- const lines = content.split('\n').filter((l) => l.trim());
166
+ const { createReadStream } = await import('node:fs');
149
167
  const id = fileName.replace('.jsonl', '');
168
+ // Read only the first chunk for preview extraction
169
+ const head = await new Promise((resolve) => {
170
+ const chunks = [];
171
+ let size = 0;
172
+ const stream = createReadStream(filePath, { end: PREVIEW_READ_BYTES - 1 });
173
+ stream.on('data', (chunk) => {
174
+ chunks.push(chunk);
175
+ size += chunk.length;
176
+ });
177
+ stream.on('end', () => resolve(Buffer.concat(chunks, size).toString('utf-8')));
178
+ stream.on('error', () => resolve(''));
179
+ });
180
+ if (!head)
181
+ return null;
150
182
  let preview = null;
151
183
  let messageCount = 0;
184
+ const lines = head.split('\n').filter((l) => l.trim());
152
185
  for (const line of lines) {
153
186
  try {
154
187
  const entry = JSON.parse(line);