heyiam 0.1.7 → 0.1.9

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 (143) hide show
  1. package/dist/analyzer.d.ts +3 -3
  2. package/dist/archive.d.ts +14 -0
  3. package/dist/archive.js +125 -0
  4. package/dist/archive.js.map +1 -0
  5. package/dist/auth.d.ts +0 -6
  6. package/dist/auth.js +2 -4
  7. package/dist/auth.js.map +1 -1
  8. package/dist/autostart.d.ts +19 -0
  9. package/dist/autostart.js +103 -0
  10. package/dist/autostart.js.map +1 -0
  11. package/dist/bridge.d.ts +0 -2
  12. package/dist/bridge.js +33 -4
  13. package/dist/bridge.js.map +1 -1
  14. package/dist/config.d.ts +1 -3
  15. package/dist/config.js +2 -4
  16. package/dist/config.js.map +1 -1
  17. package/dist/context-export.d.ts +22 -0
  18. package/dist/context-export.js +230 -0
  19. package/dist/context-export.js.map +1 -0
  20. package/dist/daemon-install.d.ts +23 -0
  21. package/dist/daemon-install.js +155 -0
  22. package/dist/daemon-install.js.map +1 -0
  23. package/dist/db.d.ts +117 -0
  24. package/dist/db.js +444 -0
  25. package/dist/db.js.map +1 -0
  26. package/dist/export.d.ts +33 -0
  27. package/dist/export.js +463 -0
  28. package/dist/export.js.map +1 -0
  29. package/dist/format-utils.d.ts +6 -0
  30. package/dist/format-utils.js +15 -0
  31. package/dist/format-utils.js.map +1 -0
  32. package/dist/index.js +474 -117
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm/project-enhance.d.ts +3 -2
  35. package/dist/llm/project-enhance.js +1 -1
  36. package/dist/parsers/claude.js +73 -0
  37. package/dist/parsers/claude.js.map +1 -1
  38. package/dist/parsers/codex.js +1 -1
  39. package/dist/parsers/codex.js.map +1 -1
  40. package/dist/parsers/cursor.d.ts +2 -0
  41. package/dist/parsers/cursor.js +14 -26
  42. package/dist/parsers/cursor.js.map +1 -1
  43. package/dist/parsers/gemini.d.ts +3 -2
  44. package/dist/parsers/gemini.js +198 -21
  45. package/dist/parsers/gemini.js.map +1 -1
  46. package/dist/parsers/index.d.ts +1 -1
  47. package/dist/parsers/index.js +23 -7
  48. package/dist/parsers/index.js.map +1 -1
  49. package/dist/parsers/types.d.ts +27 -1
  50. package/dist/render/build-render-data.d.ts +59 -0
  51. package/dist/render/build-render-data.js +101 -0
  52. package/dist/render/build-render-data.js.map +1 -0
  53. package/dist/render/components/PortfolioPage.d.ts +4 -0
  54. package/dist/render/components/PortfolioPage.js +16 -0
  55. package/dist/render/components/PortfolioPage.js.map +1 -0
  56. package/dist/render/components/ProjectPage.d.ts +4 -0
  57. package/dist/render/components/ProjectPage.js +101 -0
  58. package/dist/render/components/ProjectPage.js.map +1 -0
  59. package/dist/render/components/SessionPage.d.ts +4 -0
  60. package/dist/render/components/SessionPage.js +29 -0
  61. package/dist/render/components/SessionPage.js.map +1 -0
  62. package/dist/render/index.d.ts +37 -0
  63. package/dist/render/index.js +104 -0
  64. package/dist/render/index.js.map +1 -0
  65. package/dist/render/liquid.d.ts +19 -0
  66. package/dist/render/liquid.js +149 -0
  67. package/dist/render/liquid.js.map +1 -0
  68. package/dist/render/types.d.ts +121 -0
  69. package/dist/render/types.js +9 -0
  70. package/dist/render/types.js.map +1 -0
  71. package/dist/routes/archive.d.ts +3 -0
  72. package/dist/routes/archive.js +56 -0
  73. package/dist/routes/archive.js.map +1 -0
  74. package/dist/routes/auth.d.ts +3 -0
  75. package/dist/routes/auth.js +116 -0
  76. package/dist/routes/auth.js.map +1 -0
  77. package/dist/routes/context.d.ts +76 -0
  78. package/dist/routes/context.js +452 -0
  79. package/dist/routes/context.js.map +1 -0
  80. package/dist/routes/dashboard.d.ts +3 -0
  81. package/dist/routes/dashboard.js +103 -0
  82. package/dist/routes/dashboard.js.map +1 -0
  83. package/dist/routes/enhance.d.ts +3 -0
  84. package/dist/routes/enhance.js +305 -0
  85. package/dist/routes/enhance.js.map +1 -0
  86. package/dist/routes/export.d.ts +3 -0
  87. package/dist/routes/export.js +229 -0
  88. package/dist/routes/export.js.map +1 -0
  89. package/dist/routes/index.d.ts +12 -0
  90. package/dist/routes/index.js +13 -0
  91. package/dist/routes/index.js.map +1 -0
  92. package/dist/routes/preview.d.ts +3 -0
  93. package/dist/routes/preview.js +191 -0
  94. package/dist/routes/preview.js.map +1 -0
  95. package/dist/routes/projects.d.ts +3 -0
  96. package/dist/routes/projects.js +181 -0
  97. package/dist/routes/projects.js.map +1 -0
  98. package/dist/routes/publish.d.ts +3 -0
  99. package/dist/routes/publish.js +466 -0
  100. package/dist/routes/publish.js.map +1 -0
  101. package/dist/routes/search.d.ts +3 -0
  102. package/dist/routes/search.js +110 -0
  103. package/dist/routes/search.js.map +1 -0
  104. package/dist/routes/sessions.d.ts +3 -0
  105. package/dist/routes/sessions.js +103 -0
  106. package/dist/routes/sessions.js.map +1 -0
  107. package/dist/routes/settings.d.ts +3 -0
  108. package/dist/routes/settings.js +30 -0
  109. package/dist/routes/settings.js.map +1 -0
  110. package/dist/screenshot.d.ts +5 -2
  111. package/dist/screenshot.js +187 -13
  112. package/dist/screenshot.js.map +1 -1
  113. package/dist/search.d.ts +30 -0
  114. package/dist/search.js +153 -0
  115. package/dist/search.js.map +1 -0
  116. package/dist/server.d.ts +1 -1
  117. package/dist/server.js +55 -1318
  118. package/dist/server.js.map +1 -1
  119. package/dist/settings.d.ts +23 -6
  120. package/dist/settings.js +36 -12
  121. package/dist/settings.js.map +1 -1
  122. package/dist/source-audit.d.ts +29 -0
  123. package/dist/source-audit.js +203 -0
  124. package/dist/source-audit.js.map +1 -0
  125. package/dist/summarize.d.ts +0 -7
  126. package/dist/summarize.js +0 -20
  127. package/dist/summarize.js.map +1 -1
  128. package/dist/sync.d.ts +76 -0
  129. package/dist/sync.js +361 -0
  130. package/dist/sync.js.map +1 -0
  131. package/dist/transcript.d.ts +68 -0
  132. package/dist/transcript.js +275 -0
  133. package/dist/transcript.js.map +1 -0
  134. package/package.json +6 -2
  135. package/app/dist/assets/html2canvas-Cwn_rrOw.js +0 -5
  136. package/app/dist/assets/index-CEQyTkgN.js +0 -14
  137. package/app/dist/assets/index-DLh5xRE8.css +0 -1
  138. package/app/dist/favicon.svg +0 -5
  139. package/app/dist/icons.svg +0 -24
  140. package/app/dist/index.html +0 -20
  141. package/dist/machine-key.d.ts +0 -10
  142. package/dist/machine-key.js +0 -51
  143. package/dist/machine-key.js.map +0 -1
package/dist/export.js ADDED
@@ -0,0 +1,463 @@
1
+ /**
2
+ * Export module — produces Markdown and HTML exports of refined projects.
3
+ *
4
+ * Both functions write self-contained, offline-viewable output.
5
+ * HTML export uses the same render pipeline as publish (ReactDOMServer),
6
+ * producing JS-free static HTML safe for script-src 'self' CSP.
7
+ */
8
+ import { mkdirSync, writeFileSync, readFileSync, statSync, existsSync } from 'node:fs';
9
+ import { deflateRawSync } from 'node:zlib';
10
+ import { join, resolve, dirname } from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { loadEnhancedData } from './settings.js';
13
+ import { renderProjectHtml, renderSessionHtml } from './render/index.js';
14
+ import { escapeHtml } from './format-utils.js';
15
+ import { buildProjectRenderData, buildSessionRenderData, buildSessionCard, } from './render/build-render-data.js';
16
+ import { SCREENSHOTS_DIR } from './screenshot.js';
17
+ // ── Helpers ────────────────────────────────────────────────────
18
+ /** Resolve a project screenshot as a data URI for embedding in standalone HTML. */
19
+ function resolveScreenshotDataUri(dirName, cache) {
20
+ // Try screenshotBase64 from the enhance cache first
21
+ if (cache.screenshotBase64) {
22
+ const b64 = cache.screenshotBase64;
23
+ if (b64.startsWith('data:'))
24
+ return b64;
25
+ return `data:image/png;base64,${b64}`;
26
+ }
27
+ // Try local screenshot file
28
+ const slug = dirName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
29
+ const screenshotPath = join(SCREENSHOTS_DIR, `${slug}.png`);
30
+ if (existsSync(screenshotPath)) {
31
+ const buf = readFileSync(screenshotPath);
32
+ return `data:image/png;base64,${buf.toString('base64')}`;
33
+ }
34
+ return undefined;
35
+ }
36
+ /** Pick top 6 featured sessions — exact same logic as ProjectDetail.tsx */
37
+ function pickFeaturedSessions(sessions, cache) {
38
+ const featuredIds = new Set();
39
+ for (const t of cache.result.timeline || []) {
40
+ for (const s of t.sessions || []) {
41
+ if (s.featured)
42
+ featuredIds.add(s.sessionId);
43
+ }
44
+ }
45
+ // 1. Sessions flagged as featured in the enhance cache
46
+ const featured = sessions.filter((s) => featuredIds.has(s.id));
47
+ // 2. Enhanced sessions (status !== 'draft'), sorted by LOC desc
48
+ const enhanced = sessions
49
+ .filter((s) => (s.status === 'enhanced' || s.status === 'uploaded') && !featuredIds.has(s.id))
50
+ .sort((a, b) => b.linesOfCode - a.linesOfCode);
51
+ // 3. Draft sessions as fallback
52
+ const rest = sessions.filter((s) => s.status === 'draft' && !featuredIds.has(s.id));
53
+ const combined = [...featured, ...enhanced, ...rest];
54
+ const seen = new Set();
55
+ return combined.filter((s) => {
56
+ if (seen.has(s.id))
57
+ return false;
58
+ seen.add(s.id);
59
+ return true;
60
+ }).slice(0, 6);
61
+ }
62
+ function slugify(title) {
63
+ return title
64
+ .toLowerCase()
65
+ .replace(/[^a-z0-9]+/g, '-')
66
+ .replace(/^-|-$/g, '')
67
+ .slice(0, 80) || 'untitled';
68
+ }
69
+ function writeAndTrack(filePath, content, files) {
70
+ mkdirSync(dirname(filePath), { recursive: true });
71
+ writeFileSync(filePath, content, 'utf-8');
72
+ files.push(filePath);
73
+ return statSync(filePath).size;
74
+ }
75
+ // ── Markdown Export ────────────────────────────────────────────
76
+ export async function exportMarkdown(dirName, cache, sessions, outputPath) {
77
+ const files = [];
78
+ let totalBytes = 0;
79
+ mkdirSync(outputPath, { recursive: true });
80
+ const { result } = cache;
81
+ const title = dirName.replace(/^-/, '').replace(/-/g, ' ');
82
+ // README.md — project narrative
83
+ const readme = buildReadme(title, result, sessions);
84
+ totalBytes += writeAndTrack(join(outputPath, 'README.md'), readme, files);
85
+ // sessions/*.md — per-session breakdowns
86
+ const sessionsDir = join(outputPath, 'sessions');
87
+ mkdirSync(sessionsDir, { recursive: true });
88
+ for (const session of sessions) {
89
+ const enhanced = loadEnhancedData(session.id);
90
+ const slug = slugify(enhanced?.title ?? session.title);
91
+ const md = buildSessionMarkdown(session, enhanced);
92
+ totalBytes += writeAndTrack(join(sessionsDir, `${slug}.md`), md, files);
93
+ }
94
+ // project.json — structured data
95
+ const projectJson = JSON.stringify(result, null, 2);
96
+ totalBytes += writeAndTrack(join(outputPath, 'project.json'), projectJson, files);
97
+ return { files, totalBytes, outputPath };
98
+ }
99
+ function buildReadme(title, result, sessions) {
100
+ const lines = [];
101
+ lines.push(`# ${title}\n`);
102
+ lines.push(result.narrative);
103
+ lines.push('');
104
+ if (result.skills.length > 0) {
105
+ lines.push(`## Skills\n`);
106
+ lines.push(result.skills.map((s) => `- ${s}`).join('\n'));
107
+ lines.push('');
108
+ }
109
+ if (result.arc.length > 0) {
110
+ for (const phase of result.arc) {
111
+ lines.push(`## Phase ${phase.phase}: ${phase.title}\n`);
112
+ lines.push(phase.description);
113
+ lines.push('');
114
+ }
115
+ }
116
+ if (result.timeline.length > 0) {
117
+ lines.push(`## Timeline\n`);
118
+ for (const period of result.timeline) {
119
+ lines.push(`### ${period.label} (${period.period})\n`);
120
+ for (const s of period.sessions) {
121
+ const featured = s.featured ? ' **featured**' : '';
122
+ const tag = s.tag ? ` [${s.tag}]` : '';
123
+ lines.push(`- [${s.title}](sessions/${slugify(s.title)}.md)${tag}${featured}`);
124
+ }
125
+ lines.push('');
126
+ }
127
+ }
128
+ lines.push(`## Stats\n`);
129
+ lines.push(`- Sessions: ${sessions.length}`);
130
+ const totalLoc = sessions.reduce((sum, s) => sum + s.linesOfCode, 0);
131
+ const totalMin = sessions.reduce((sum, s) => sum + s.durationMinutes, 0);
132
+ const totalFiles = sessions.reduce((sum, s) => sum + s.filesChanged.length, 0);
133
+ lines.push(`- Lines of code: ${totalLoc.toLocaleString()}`);
134
+ lines.push(`- Total time: ${(totalMin / 60).toFixed(1)}h`);
135
+ lines.push(`- Files changed: ${totalFiles}`);
136
+ lines.push('');
137
+ return lines.join('\n');
138
+ }
139
+ function buildSessionMarkdown(session, enhanced) {
140
+ const lines = [];
141
+ const title = enhanced?.title ?? session.title;
142
+ lines.push(`# ${title}\n`);
143
+ if (enhanced?.developerTake ?? session.developerTake) {
144
+ lines.push(`> ${(enhanced?.developerTake ?? session.developerTake ?? '').replace(/\n/g, '\n> ')}\n`);
145
+ }
146
+ if (enhanced?.context) {
147
+ lines.push(`## Context\n`);
148
+ lines.push(enhanced.context);
149
+ lines.push('');
150
+ }
151
+ const steps = enhanced?.executionSteps ?? session.executionPath ?? [];
152
+ if (steps.length > 0) {
153
+ lines.push(`## Execution Path\n`);
154
+ for (const step of steps) {
155
+ const body = step.description ?? step.body ?? '';
156
+ lines.push(`### ${step.stepNumber ?? ''}. ${step.title}\n`);
157
+ lines.push(body);
158
+ lines.push('');
159
+ }
160
+ }
161
+ const qaPairs = enhanced?.qaPairs ?? session.qaPairs ?? [];
162
+ if (qaPairs.length > 0) {
163
+ lines.push(`## Q&A\n`);
164
+ for (const qa of qaPairs) {
165
+ lines.push(`**Q: ${qa.question}**\n`);
166
+ lines.push(qa.answer);
167
+ lines.push('');
168
+ }
169
+ }
170
+ const skills = enhanced?.skills ?? session.skills ?? [];
171
+ if (skills.length > 0) {
172
+ lines.push(`## Skills\n`);
173
+ lines.push(skills.map((s) => `- ${s}`).join('\n'));
174
+ lines.push('');
175
+ }
176
+ lines.push(`## Stats\n`);
177
+ lines.push(`- Duration: ${session.durationMinutes}m`);
178
+ lines.push(`- Turns: ${session.turns}`);
179
+ lines.push(`- LOC: ${session.linesOfCode}`);
180
+ lines.push(`- Files changed: ${session.filesChanged.length}`);
181
+ lines.push(`- Tool calls: ${session.toolCalls}`);
182
+ if (session.source)
183
+ lines.push(`- Source: ${session.source}`);
184
+ lines.push('');
185
+ return lines.join('\n');
186
+ }
187
+ export async function exportHtml(dirName, cache, sessions, outputPath, username = 'local', opts) {
188
+ const files = [];
189
+ let totalBytes = 0;
190
+ mkdirSync(outputPath, { recursive: true });
191
+ const { result } = cache;
192
+ const slug = slugify(dirName);
193
+ const title = dirName.replace(/^-/, '').replace(/-/g, ' ');
194
+ // Use ALL sessions (same as dashboard), build cards for each
195
+ const sessionCards = sessions.map((session) => {
196
+ return buildSessionCard({
197
+ sessionId: session.id,
198
+ session,
199
+ enhanced: null,
200
+ username,
201
+ projectSlug: slug,
202
+ sessionSlug: slugify(session.title),
203
+ sourceTool: session.source ?? 'unknown',
204
+ });
205
+ });
206
+ // Compute stats the same way the dashboard does
207
+ const totalLoc = sessions.reduce((sum, s) => sum + s.linesOfCode, 0);
208
+ const totalDurationMinutes = sessions.reduce((sum, s) => sum + s.durationMinutes, 0);
209
+ const totalFilesChanged = opts?.totalFilesChanged ?? sessions.reduce((sum, s) => sum + s.filesChanged.length, 0);
210
+ // Agent duration: sum child durations across all orchestrated sessions
211
+ const totalAgentMinutes = sessions
212
+ .filter((s) => s.isOrchestrated && s.children)
213
+ .reduce((sum, s) => sum + s.children.reduce((cs, c) => cs + c.durationMinutes, 0), 0);
214
+ const totalAgentDurationMinutes = totalAgentMinutes > 0 ? totalDurationMinutes + totalAgentMinutes : undefined;
215
+ // Resolve screenshot for embedding
216
+ const screenshotUrl = resolveScreenshotDataUri(dirName, cache);
217
+ // Render project index.html — pass same data shape as dashboard
218
+ const projectRenderData = buildProjectRenderData({
219
+ username,
220
+ slug,
221
+ title,
222
+ narrative: result.narrative,
223
+ repoUrl: cache.repoUrl,
224
+ projectUrl: cache.projectUrl,
225
+ screenshotUrl,
226
+ timeline: result.timeline.map((t) => ({
227
+ period: t.period,
228
+ label: t.label,
229
+ sessions: t.sessions,
230
+ })),
231
+ skills: result.skills,
232
+ totalSessions: sessions.length,
233
+ totalLoc,
234
+ totalDurationMinutes,
235
+ totalAgentDurationMinutes,
236
+ totalFilesChanged,
237
+ sessionCards,
238
+ sessionBaseUrl: './sessions',
239
+ });
240
+ const projectBody = renderProjectHtml(projectRenderData, {
241
+ arc: result.arc,
242
+ fullSessions: sessions,
243
+ });
244
+ const projectHtml = buildStandalonePage(title, projectBody);
245
+ totalBytes += writeAndTrack(join(outputPath, 'index.html'), projectHtml, files);
246
+ // Render session pages — only featured sessions (linked from project page)
247
+ const featuredSessions = pickFeaturedSessions(sessions, cache);
248
+ const sessionsDir = join(outputPath, 'sessions');
249
+ mkdirSync(sessionsDir, { recursive: true });
250
+ for (const session of featuredSessions) {
251
+ const sessionSlug = slugify(session.title);
252
+ const renderData = buildSessionRenderData({
253
+ sessionId: session.id,
254
+ session,
255
+ enhanced: null,
256
+ username,
257
+ projectSlug: slug,
258
+ sessionSlug,
259
+ sourceTool: session.source ?? 'unknown',
260
+ });
261
+ const sessionBody = renderSessionHtml(renderData);
262
+ const sessionHtml = buildStandalonePage(session.title, sessionBody);
263
+ totalBytes += writeAndTrack(join(sessionsDir, `${sessionSlug}.html`), sessionHtml, files);
264
+ }
265
+ return { files, totalBytes, outputPath };
266
+ }
267
+ function getInlineCss() {
268
+ const thisDir = dirname(fileURLToPath(import.meta.url));
269
+ const cssPath = resolve(thisDir, 'render', 'templates', 'styles.css');
270
+ try {
271
+ return readFileSync(cssPath, 'utf-8');
272
+ }
273
+ catch {
274
+ return '';
275
+ }
276
+ }
277
+ /**
278
+ * Generate HTML files in memory (no disk writes).
279
+ * Returns an array of {path, content} for zipping.
280
+ */
281
+ export function generateHtmlFiles(dirName, cache, sessions, username = 'local', opts) {
282
+ const files = [];
283
+ const { result } = cache;
284
+ const slug = slugify(dirName);
285
+ const title = dirName.replace(/^-/, '').replace(/-/g, ' ');
286
+ // Use ALL sessions — same as dashboard
287
+ const sessionCards = sessions.map((session) => {
288
+ return buildSessionCard({
289
+ sessionId: session.id,
290
+ session,
291
+ enhanced: null,
292
+ username,
293
+ projectSlug: slug,
294
+ sessionSlug: slugify(session.title),
295
+ sourceTool: session.source ?? 'unknown',
296
+ });
297
+ });
298
+ const totalLoc = sessions.reduce((sum, s) => sum + s.linesOfCode, 0);
299
+ const totalDurationMinutes = sessions.reduce((sum, s) => sum + s.durationMinutes, 0);
300
+ const totalFilesChanged = opts?.totalFilesChanged ?? sessions.reduce((sum, s) => sum + s.filesChanged.length, 0);
301
+ const totalAgentMinutes = sessions
302
+ .filter((s) => s.isOrchestrated && s.children)
303
+ .reduce((sum, s) => sum + s.children.reduce((cs, c) => cs + c.durationMinutes, 0), 0);
304
+ const totalAgentDurationMinutes = totalAgentMinutes > 0 ? totalDurationMinutes + totalAgentMinutes : undefined;
305
+ const screenshotUrl = resolveScreenshotDataUri(dirName, cache);
306
+ const projectRenderData = buildProjectRenderData({
307
+ username, slug, title,
308
+ narrative: result.narrative,
309
+ repoUrl: cache.repoUrl,
310
+ projectUrl: cache.projectUrl,
311
+ screenshotUrl,
312
+ timeline: result.timeline.map((t) => ({
313
+ period: t.period,
314
+ label: t.label,
315
+ sessions: t.sessions,
316
+ })),
317
+ skills: result.skills,
318
+ totalSessions: sessions.length,
319
+ totalLoc,
320
+ totalDurationMinutes,
321
+ totalAgentDurationMinutes,
322
+ totalFilesChanged,
323
+ sessionCards,
324
+ sessionBaseUrl: './sessions',
325
+ });
326
+ const projectBody = renderProjectHtml(projectRenderData, {
327
+ arc: result.arc,
328
+ fullSessions: sessions,
329
+ });
330
+ files.push({ path: 'index.html', content: buildStandalonePage(title, projectBody) });
331
+ const featuredSessions = pickFeaturedSessions(sessions, cache);
332
+ for (const session of featuredSessions) {
333
+ const sessionSlug = slugify(session.title);
334
+ const renderData = buildSessionRenderData({
335
+ sessionId: session.id,
336
+ session, enhanced: null, username,
337
+ projectSlug: slug, sessionSlug,
338
+ sourceTool: session.source ?? 'unknown',
339
+ });
340
+ const sessionBody = renderSessionHtml(renderData);
341
+ files.push({
342
+ path: `sessions/${sessionSlug}.html`,
343
+ content: buildStandalonePage(session.title, sessionBody),
344
+ });
345
+ }
346
+ return files;
347
+ }
348
+ // ── Minimal ZIP builder (zero dependencies) ──────────────────
349
+ /**
350
+ * Create a ZIP file buffer from an array of {path, content} entries.
351
+ * Uses DEFLATE compression via Node's built-in zlib.
352
+ */
353
+ export function createZipBuffer(entries) {
354
+ const centralDir = [];
355
+ const fileData = [];
356
+ let offset = 0;
357
+ // MS-DOS time/date for current timestamp
358
+ const now = new Date();
359
+ const dosTime = ((now.getHours() << 11) | (now.getMinutes() << 5) | (now.getSeconds() >> 1)) & 0xffff;
360
+ const dosDate = (((now.getFullYear() - 1980) << 9) | ((now.getMonth() + 1) << 5) | now.getDate()) & 0xffff;
361
+ for (const entry of entries) {
362
+ const nameBytes = Buffer.from(entry.path, 'utf-8');
363
+ const raw = Buffer.from(entry.content, 'utf-8');
364
+ const compressed = deflateRawSync(raw);
365
+ const crc = crc32(raw);
366
+ // Local file header
367
+ const local = Buffer.alloc(30 + nameBytes.length);
368
+ local.writeUInt32LE(0x04034b50, 0); // signature
369
+ local.writeUInt16LE(20, 4); // version needed
370
+ local.writeUInt16LE(0, 6); // flags
371
+ local.writeUInt16LE(8, 8); // compression: deflate
372
+ local.writeUInt16LE(dosTime, 10); // mod time
373
+ local.writeUInt16LE(dosDate, 12); // mod date
374
+ local.writeUInt32LE(crc, 14); // crc32
375
+ local.writeUInt32LE(compressed.length, 18); // compressed size
376
+ local.writeUInt32LE(raw.length, 22); // uncompressed size
377
+ local.writeUInt16LE(nameBytes.length, 26); // name length
378
+ local.writeUInt16LE(0, 28); // extra field length
379
+ nameBytes.copy(local, 30);
380
+ fileData.push(local, compressed);
381
+ // Central directory entry
382
+ const central = Buffer.alloc(46 + nameBytes.length);
383
+ central.writeUInt32LE(0x02014b50, 0); // signature
384
+ central.writeUInt16LE(20, 4); // version made by
385
+ central.writeUInt16LE(20, 6); // version needed
386
+ central.writeUInt16LE(0, 8); // flags
387
+ central.writeUInt16LE(8, 10); // compression: deflate
388
+ central.writeUInt16LE(dosTime, 12); // mod time
389
+ central.writeUInt16LE(dosDate, 14); // mod date
390
+ central.writeUInt32LE(crc, 16); // crc32
391
+ central.writeUInt32LE(compressed.length, 20);
392
+ central.writeUInt32LE(raw.length, 24);
393
+ central.writeUInt16LE(nameBytes.length, 28);
394
+ central.writeUInt16LE(0, 30); // extra field length
395
+ central.writeUInt16LE(0, 32); // comment length
396
+ central.writeUInt16LE(0, 34); // disk number start
397
+ central.writeUInt16LE(0, 36); // internal attributes
398
+ central.writeUInt32LE(0, 38); // external attributes
399
+ central.writeUInt32LE(offset, 42); // local header offset
400
+ nameBytes.copy(central, 46);
401
+ centralDir.push(central);
402
+ offset += local.length + compressed.length;
403
+ }
404
+ const centralDirBuf = Buffer.concat(centralDir);
405
+ const centralDirOffset = offset;
406
+ // End of central directory
407
+ const eocd = Buffer.alloc(22);
408
+ eocd.writeUInt32LE(0x06054b50, 0);
409
+ eocd.writeUInt16LE(0, 4); // disk number
410
+ eocd.writeUInt16LE(0, 6); // disk with central dir
411
+ eocd.writeUInt16LE(entries.length, 8); // entries on this disk
412
+ eocd.writeUInt16LE(entries.length, 10); // total entries
413
+ eocd.writeUInt32LE(centralDirBuf.length, 12);
414
+ eocd.writeUInt32LE(centralDirOffset, 16);
415
+ eocd.writeUInt16LE(0, 20); // comment length
416
+ return Buffer.concat([...fileData, centralDirBuf, eocd]);
417
+ }
418
+ /** CRC-32 (ISO 3309) */
419
+ function crc32(buf) {
420
+ let crc = 0xffffffff;
421
+ for (let i = 0; i < buf.length; i++) {
422
+ crc ^= buf[i];
423
+ for (let j = 0; j < 8; j++) {
424
+ crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);
425
+ }
426
+ }
427
+ return (crc ^ 0xffffffff) >>> 0;
428
+ }
429
+ function getInlineMountJs() {
430
+ const thisDir = dirname(fileURLToPath(import.meta.url));
431
+ const mountPath = resolve(thisDir, '..', '..', 'packages', 'ui', 'dist', 'mount.js');
432
+ try {
433
+ return readFileSync(mountPath, 'utf-8');
434
+ }
435
+ catch {
436
+ return '';
437
+ }
438
+ }
439
+ function buildStandalonePage(title, bodyHtml) {
440
+ const css = getInlineCss();
441
+ const cssTag = css
442
+ ? `<style>${css}\nbody { overflow: auto !important; min-height: auto !important; background: var(--color-surface, #f8f9fb); }</style>`
443
+ : '';
444
+ const mountJs = getInlineMountJs();
445
+ const scriptTag = mountJs ? `<script>${mountJs}</script>` : '';
446
+ return `<!DOCTYPE html>
447
+ <html lang="en">
448
+ <head>
449
+ <meta charset="utf-8" />
450
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
451
+ <title>${escapeHtml(title)} — heyi.am</title>
452
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
453
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
454
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet" />
455
+ ${cssTag}
456
+ </head>
457
+ <body>
458
+ ${bodyHtml}
459
+ ${scriptTag}
460
+ </body>
461
+ </html>`;
462
+ }
463
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Escape HTML special characters for safe embedding. */
2
+ export declare function escapeHtml(str: string): string;
3
+ /** Format LOC as human-readable (e.g. "2.4k"). */
4
+ export declare function formatLoc(loc: number): string;
5
+ /** Escape LIKE wildcards in user input for safe use in SQL LIKE clauses. */
6
+ export declare function escapeLikeWildcards(str: string): string;
@@ -0,0 +1,15 @@
1
+ /** Escape HTML special characters for safe embedding. */
2
+ export function escapeHtml(str) {
3
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
4
+ }
5
+ /** Format LOC as human-readable (e.g. "2.4k"). */
6
+ export function formatLoc(loc) {
7
+ if (loc >= 1000)
8
+ return `${(loc / 1000).toFixed(1)}k`;
9
+ return String(loc);
10
+ }
11
+ /** Escape LIKE wildcards in user input for safe use in SQL LIKE clauses. */
12
+ export function escapeLikeWildcards(str) {
13
+ return str.replace(/[%_]/g, (c) => `\\${c}`);
14
+ }
15
+ //# sourceMappingURL=format-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../src/format-utils.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxG,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC"}