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
@@ -0,0 +1,305 @@
1
+ import { Router } from 'express';
2
+ import { getProvider } from '../llm/index.js';
3
+ import { triageSessions } from '../llm/triage.js';
4
+ import { enhanceProject, refineNarrative } from '../llm/project-enhance.js';
5
+ import { getAnthropicApiKey, saveEnhancedData, loadEnhancedData, deleteEnhancedData, loadFreshProjectEnhanceResult, saveProjectEnhanceResult, loadProjectEnhanceResult, buildProjectFingerprint, getUploadedState, } from '../settings.js';
6
+ export function createEnhanceRouter(ctx) {
7
+ const router = Router();
8
+ // Triage endpoint -- AI selects which sessions are worth showcasing (SSE stream)
9
+ router.post('/api/projects/:project/triage', async (req, res) => {
10
+ if (!getAnthropicApiKey()) {
11
+ res.status(400).json({ error: { code: 'NO_API_KEY', message: 'No Anthropic API key configured. Add one in Settings or set ANTHROPIC_API_KEY.' } });
12
+ return;
13
+ }
14
+ const { project } = req.params;
15
+ const projects = await ctx.getProjects();
16
+ const proj = projects.find((p) => p.name === project || p.dirName === project);
17
+ if (!proj) {
18
+ res.status(404).json({ error: { code: 'PROJECT_NOT_FOUND', message: 'Project not found' } });
19
+ return;
20
+ }
21
+ res.writeHead(200, {
22
+ 'Content-Type': 'text/event-stream',
23
+ 'Cache-Control': 'no-cache',
24
+ Connection: 'keep-alive',
25
+ });
26
+ const send = (event) => {
27
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
28
+ };
29
+ try {
30
+ const total = proj.sessions.length;
31
+ const sessionsWithStats = [];
32
+ for (let i = 0; i < proj.sessions.length; i++) {
33
+ const meta = proj.sessions[i];
34
+ send({ type: 'loading_stats', sessionId: meta.sessionId, index: i, total });
35
+ const stats = await ctx.getSessionStats(meta, proj.name);
36
+ sessionsWithStats.push({
37
+ sessionId: meta.sessionId,
38
+ path: meta.path,
39
+ title: stats.date ? `Session ${meta.sessionId.slice(0, 8)}` : meta.sessionId,
40
+ duration: stats.duration,
41
+ loc: stats.loc,
42
+ turns: stats.turns,
43
+ files: stats.files,
44
+ skills: stats.skills,
45
+ date: stats.date,
46
+ });
47
+ }
48
+ const useLLM = req.body?.useLLM !== false;
49
+ const result = await triageSessions(sessionsWithStats, useLLM, (event) => {
50
+ send(event);
51
+ });
52
+ const published = getUploadedState(proj.dirName);
53
+ const alreadyUploaded = published?.uploadedSessions ?? [];
54
+ send({ type: 'result', ...result, alreadyUploaded });
55
+ res.end();
56
+ }
57
+ catch (err) {
58
+ send({ type: 'error', code: 'TRIAGE_FAILED', message: err.message });
59
+ res.end();
60
+ }
61
+ });
62
+ // Enhance a single session
63
+ router.post('/api/projects/:project/sessions/:id/enhance', async (req, res) => {
64
+ try {
65
+ const { project, id } = req.params;
66
+ const projects = await ctx.getProjects();
67
+ const proj = projects.find((p) => p.name === project || p.dirName === project);
68
+ if (!proj) {
69
+ res.status(404).json({ error: { code: 'PROJECT_NOT_FOUND', message: 'Project not found' } });
70
+ return;
71
+ }
72
+ const meta = proj.sessions.find((s) => s.sessionId === id);
73
+ if (!meta) {
74
+ res.status(404).json({ error: { code: 'SESSION_NOT_FOUND', message: 'Session not found' } });
75
+ return;
76
+ }
77
+ const session = await ctx.loadSession(meta.path, proj.name, meta.sessionId);
78
+ const provider = getProvider();
79
+ const result = await provider.enhance(session);
80
+ saveEnhancedData(id, result);
81
+ console.log(`[enhance] Saved enhanced data for ${id}`);
82
+ res.json({ result, provider: provider.name });
83
+ }
84
+ catch (err) {
85
+ const error = err;
86
+ res.status(500).json({
87
+ error: {
88
+ code: error.code ?? 'ENHANCE_FAILED',
89
+ message: error.message,
90
+ },
91
+ });
92
+ }
93
+ });
94
+ // Delete locally-saved enhanced data
95
+ router.delete('/api/sessions/:id/enhanced', (_req, res) => {
96
+ const { id } = _req.params;
97
+ deleteEnhancedData(id);
98
+ console.log(`[enhance] Deleted enhanced data for ${id}`);
99
+ res.json({ ok: true });
100
+ });
101
+ // Enhancement status
102
+ router.get('/api/enhance/status', async (_req, res) => {
103
+ try {
104
+ if (getAnthropicApiKey()) {
105
+ res.json({ mode: 'local', remaining: null });
106
+ }
107
+ else {
108
+ res.json({ mode: 'none', remaining: 0, message: 'No API key configured' });
109
+ }
110
+ }
111
+ catch {
112
+ res.json({ mode: 'unknown', remaining: null });
113
+ }
114
+ });
115
+ // Project enhance -- enhance selected sessions + generate project narrative (SSE)
116
+ router.post('/api/projects/:project/enhance-project', async (req, res) => {
117
+ const { project } = req.params;
118
+ const { selectedSessionIds, skippedSessions, force } = req.body;
119
+ if (!Array.isArray(selectedSessionIds) || selectedSessionIds.length === 0) {
120
+ res.status(400).json({ error: { code: 'INVALID_INPUT', message: 'selectedSessionIds must be a non-empty array' } });
121
+ return;
122
+ }
123
+ if (!getAnthropicApiKey()) {
124
+ res.status(400).json({ error: { code: 'NO_API_KEY', message: 'No Anthropic API key configured. Add one in Settings or set ANTHROPIC_API_KEY.' } });
125
+ return;
126
+ }
127
+ res.writeHead(200, {
128
+ 'Content-Type': 'text/event-stream',
129
+ 'Cache-Control': 'no-cache',
130
+ Connection: 'keep-alive',
131
+ });
132
+ const send = (data) => {
133
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
134
+ };
135
+ try {
136
+ const projects = await ctx.getProjects();
137
+ const proj = projects.find((p) => p.name === project || p.dirName === project);
138
+ if (!proj) {
139
+ send({ type: 'error', code: 'PROJECT_NOT_FOUND', message: 'Project not found' });
140
+ res.end();
141
+ return;
142
+ }
143
+ if (!force) {
144
+ const cached = loadFreshProjectEnhanceResult(proj.dirName, selectedSessionIds);
145
+ if (cached) {
146
+ send({ type: 'cached', enhancedAt: cached.enhancedAt });
147
+ send({ type: 'done', result: cached.result });
148
+ res.end();
149
+ return;
150
+ }
151
+ }
152
+ const staleCache = loadProjectEnhanceResult(proj.dirName);
153
+ if (staleCache) {
154
+ const currentFp = buildProjectFingerprint(selectedSessionIds);
155
+ if (staleCache.fingerprint !== currentFp) {
156
+ send({ type: 'stale_cache', previousEnhancedAt: staleCache.enhancedAt });
157
+ }
158
+ }
159
+ const provider = getProvider();
160
+ const sessionSummaries = [];
161
+ const CONCURRENCY = 3;
162
+ for (let i = 0; i < selectedSessionIds.length; i += CONCURRENCY) {
163
+ const batch = selectedSessionIds.slice(i, i + CONCURRENCY);
164
+ await Promise.all(batch.map(async (sessionId) => {
165
+ const meta = proj.sessions.find((s) => s.sessionId === sessionId);
166
+ if (!meta)
167
+ return;
168
+ const existing = loadEnhancedData(sessionId);
169
+ if (existing) {
170
+ send({ type: 'session_progress', sessionId, status: 'skipped', title: existing.title, skills: existing.skills });
171
+ sessionSummaries.push({
172
+ sessionId,
173
+ title: existing.title,
174
+ developerTake: existing.developerTake,
175
+ skills: existing.skills,
176
+ executionSteps: existing.executionSteps.map((s) => ({ title: s.title, body: s.body })),
177
+ duration: 0,
178
+ loc: 0,
179
+ turns: 0,
180
+ files: 0,
181
+ date: existing.enhancedAt,
182
+ });
183
+ return;
184
+ }
185
+ send({ type: 'session_progress', sessionId, status: 'enhancing' });
186
+ try {
187
+ const session = await ctx.loadSession(meta.path, proj.name, sessionId);
188
+ const result = await provider.enhance(session);
189
+ saveEnhancedData(sessionId, result);
190
+ send({ type: 'session_progress', sessionId, status: 'done', title: result.title, skills: result.skills });
191
+ sessionSummaries.push({
192
+ sessionId,
193
+ title: result.title,
194
+ developerTake: result.developerTake,
195
+ skills: result.skills,
196
+ executionSteps: result.executionSteps.map((s) => ({ title: s.title, body: s.body })),
197
+ duration: session.durationMinutes ?? 0,
198
+ loc: session.linesOfCode ?? 0,
199
+ turns: session.turns ?? 0,
200
+ files: session.filesChanged?.length ?? 0,
201
+ date: session.date ?? '',
202
+ });
203
+ }
204
+ catch (err) {
205
+ console.error(`[enhance-project] Session ${sessionId} failed:`, err.message);
206
+ send({ type: 'session_progress', sessionId, status: 'failed', error: err.message });
207
+ }
208
+ }));
209
+ }
210
+ for (const summary of sessionSummaries) {
211
+ if (summary.duration === 0) {
212
+ const meta = proj.sessions.find((s) => s.sessionId === summary.sessionId);
213
+ if (meta) {
214
+ const stats = await ctx.getSessionStats(meta, proj.name);
215
+ summary.duration = stats.duration;
216
+ summary.loc = stats.loc;
217
+ summary.turns = stats.turns;
218
+ summary.files = stats.files;
219
+ summary.date = stats.date || summary.date;
220
+ summary.correctionCount = undefined;
221
+ }
222
+ }
223
+ }
224
+ send({ type: 'project_enhance', status: 'generating' });
225
+ const projectResult = await enhanceProject(sessionSummaries, skippedSessions ?? [], (event) => {
226
+ send({ type: event.type, text: event.text });
227
+ });
228
+ saveProjectEnhanceResult(proj.dirName, selectedSessionIds, projectResult);
229
+ send({ type: 'done', result: projectResult });
230
+ res.end();
231
+ }
232
+ catch (err) {
233
+ console.error('[enhance-project] Failed:', err.message);
234
+ send({ type: 'error', code: 'ENHANCE_FAILED', message: err.message });
235
+ res.end();
236
+ }
237
+ });
238
+ // Save project enhance result explicitly
239
+ router.post('/api/projects/:project/enhance-save', async (req, res) => {
240
+ const { project } = req.params;
241
+ const { selectedSessionIds, result, repoUrl, projectUrl, screenshotBase64 } = req.body;
242
+ if (!Array.isArray(selectedSessionIds) || !result?.narrative) {
243
+ res.status(400).json({ error: { code: 'INVALID_INPUT', message: 'selectedSessionIds and result are required' } });
244
+ return;
245
+ }
246
+ try {
247
+ const projects = await ctx.getProjects();
248
+ const proj = projects.find((p) => p.name === project || p.dirName === project);
249
+ if (!proj) {
250
+ res.status(404).json({ error: { code: 'PROJECT_NOT_FOUND', message: 'Project not found' } });
251
+ return;
252
+ }
253
+ saveProjectEnhanceResult(proj.dirName, selectedSessionIds, result, undefined, { repoUrl, projectUrl, screenshotBase64 });
254
+ res.json({ saved: true, enhancedAt: new Date().toISOString() });
255
+ }
256
+ catch (err) {
257
+ res.status(500).json({ error: { code: 'SAVE_FAILED', message: err.message } });
258
+ }
259
+ });
260
+ // Get cached project enhance result
261
+ router.get('/api/projects/:project/enhance-cache', async (req, res) => {
262
+ const { project } = req.params;
263
+ try {
264
+ const projects = await ctx.getProjects();
265
+ const proj = projects.find((p) => p.name === project || p.dirName === project);
266
+ if (!proj) {
267
+ res.status(404).json({ error: { code: 'PROJECT_NOT_FOUND', message: 'Project not found' } });
268
+ return;
269
+ }
270
+ const cached = loadProjectEnhanceResult(proj.dirName);
271
+ if (!cached) {
272
+ res.status(404).json({ error: { code: 'NO_CACHE', message: 'No cached enhance result' } });
273
+ return;
274
+ }
275
+ const currentFp = buildProjectFingerprint(cached.selectedSessionIds);
276
+ const isFresh = cached.fingerprint === currentFp;
277
+ res.json({
278
+ ...cached,
279
+ isFresh,
280
+ });
281
+ }
282
+ catch (err) {
283
+ res.status(500).json({ error: { code: 'CACHE_READ_FAILED', message: err.message } });
284
+ }
285
+ });
286
+ // Narrative refinement
287
+ router.post('/api/projects/:project/refine-narrative', async (req, res) => {
288
+ try {
289
+ const { draftNarrative, draftTimeline, answers } = req.body;
290
+ if (!draftNarrative || typeof draftNarrative !== 'string') {
291
+ res.status(400).json({ error: { code: 'INVALID_INPUT', message: 'draftNarrative is required' } });
292
+ return;
293
+ }
294
+ const refined = await refineNarrative(draftNarrative, draftTimeline ?? [], answers ?? []);
295
+ res.json(refined);
296
+ }
297
+ catch (err) {
298
+ res.status(500).json({
299
+ error: { code: 'REFINE_FAILED', message: err.message },
300
+ });
301
+ }
302
+ });
303
+ return router;
304
+ }
305
+ //# sourceMappingURL=enhance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhance.js","sourceRoot":"","sources":["../../src/routes/enhance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAA6B,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAA2E,MAAM,2BAA2B,CAAC;AACrJ,OAAO,EACsC,kBAAkB,EAC7D,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EACtD,6BAA6B,EAAE,wBAAwB,EACvD,wBAAwB,EAAE,uBAAuB,EACjD,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,iFAAiF;IACjF,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACjF,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gFAAgF,EAAE,EAAE,CAAC,CAAC;YACnJ,OAAO;QACT,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,KAA8B,EAAE,EAAE;YAC9C,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnC,MAAM,iBAAiB,GAA2B,EAAE,CAAC;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzD,iBAAiB,CAAC,IAAI,CAAC;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;oBAC5E,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvE,IAAI,CAAC,KAA2C,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,eAAe,GAAG,SAAS,EAAE,gBAAgB,IAAI,EAAE,CAAC;YAE1D,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChF,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC/F,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE/C,gBAAgB,CAAC,EAAY,EAAE,MAAM,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAgC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB;oBACpC,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC3E,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAY,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;QACvE,IAAI,CAAC;YACH,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC1F,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAI1D,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,8CAA8C,EAAE,EAAE,CAAC,CAAC;YACpH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gFAAgF,EAAE,EAAE,CAAC,CAAC;YACnJ,OAAO;QACT,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,IAA6B,EAAE,EAAE;YAC7C,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACjF,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;gBAC/E,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBACxD,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAE/B,MAAM,gBAAgB,GAAqB,EAAE,CAAC;YAC9C,MAAM,WAAW,GAAG,CAAC,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;gBAChE,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC3D,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;oBAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;oBAClE,IAAI,CAAC,IAAI;wBAAE,OAAO;oBAElB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;oBAC7C,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;wBACjH,gBAAgB,CAAC,IAAI,CAAC;4BACpB,SAAS;4BACT,KAAK,EAAE,QAAQ,CAAC,KAAK;4BACrB,aAAa,EAAE,QAAQ,CAAC,aAAa;4BACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;4BACtF,QAAQ,EAAE,CAAC;4BACX,GAAG,EAAE,CAAC;4BACN,KAAK,EAAE,CAAC;4BACR,KAAK,EAAE,CAAC;4BACR,IAAI,EAAE,QAAQ,CAAC,UAAU;yBAC1B,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;oBAEnE,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;wBACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC/C,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAEpC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;wBAE1G,gBAAgB,CAAC,IAAI,CAAC;4BACpB,SAAS;4BACT,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,aAAa,EAAE,MAAM,CAAC,aAAa;4BACnC,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;4BACpF,QAAQ,EAAE,OAAO,CAAC,eAAe,IAAI,CAAC;4BACtC,GAAG,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;4BAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;4BACzB,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;4BACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;yBACzB,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,UAAU,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;wBACxF,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;YACN,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC1E,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACzD,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;wBAClC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;wBACxB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;wBAC5B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;wBAC5B,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;wBAC1C,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YAExD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,gBAAgB,EAAE,eAAe,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5F,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;YAE1E,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACnE,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACvF,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,IAMjF,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,4CAA4C,EAAE,EAAE,CAAC,CAAC;YAClH,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACzH,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACvF,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC;YAEjD,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,MAAM;gBACT,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3F,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAItD,CAAC;YAEF,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;gBAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;gBAClG,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,aAAa,IAAI,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;YAC1F,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Router } from 'express';
2
+ import { type RouteContext } from './context.js';
3
+ export declare function createExportRouter(ctx: RouteContext): Router;
@@ -0,0 +1,229 @@
1
+ import { Router } from 'express';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ import { execFileSync } from 'node:child_process';
5
+ import { exportMarkdown, exportHtml, generateHtmlFiles, createZipBuffer } from '../export.js';
6
+ import { buildProjectDetail } from './context.js';
7
+ const EXPORTS_BASE = path.resolve(process.env.HOME || '~', '.config', 'heyiam', 'exports');
8
+ /** Validate that an output path is within the safe exports directory. */
9
+ function safeExportPath(outputPath, dirName, format) {
10
+ const defaultPath = path.join(EXPORTS_BASE, dirName, format);
11
+ if (!outputPath)
12
+ return defaultPath;
13
+ const resolved = path.resolve(outputPath);
14
+ if (!resolved.startsWith(EXPORTS_BASE))
15
+ return defaultPath;
16
+ return resolved;
17
+ }
18
+ /** Load the full project detail — same data the dashboard receives. */
19
+ async function loadProjectData(ctx, dirName) {
20
+ const projects = await ctx.getProjects();
21
+ const proj = projects.find((p) => p.dirName === dirName);
22
+ if (!proj)
23
+ return null;
24
+ return buildProjectDetail(ctx.db, proj);
25
+ }
26
+ /** Build a minimal ProjectEnhanceCache from raw session data for non-enhanced exports. */
27
+ function buildFallbackCache(sessions) {
28
+ const allSkills = [...new Set(sessions.flatMap((s) => s.skills))];
29
+ const allIds = sessions.map((s) => s.id);
30
+ // Group sessions by month for the timeline
31
+ const byMonth = new Map();
32
+ for (const s of sessions) {
33
+ const d = new Date(s.date);
34
+ const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;
35
+ if (!byMonth.has(key))
36
+ byMonth.set(key, []);
37
+ byMonth.get(key).push(s);
38
+ }
39
+ const timeline = [...byMonth.entries()]
40
+ .sort(([a], [b]) => a.localeCompare(b))
41
+ .map(([period, sess]) => ({
42
+ period,
43
+ label: period,
44
+ sessions: sess.map((s) => ({
45
+ sessionId: s.id,
46
+ title: s.title,
47
+ featured: false,
48
+ })),
49
+ }));
50
+ return {
51
+ fingerprint: 'fallback',
52
+ enhancedAt: new Date().toISOString(),
53
+ selectedSessionIds: allIds,
54
+ result: {
55
+ narrative: '',
56
+ arc: [],
57
+ skills: allSkills,
58
+ timeline,
59
+ questions: [],
60
+ },
61
+ };
62
+ }
63
+ export function createExportRouter(ctx) {
64
+ const router = Router();
65
+ router.post('/api/projects/:project/save-local', async (req, res) => {
66
+ try {
67
+ const dirName = String(req.params.project);
68
+ const data = await loadProjectData(ctx, dirName);
69
+ if (!data) {
70
+ res.status(404).json({ error: 'Project not found' });
71
+ return;
72
+ }
73
+ const cache = data.enhanceCache ?? buildFallbackCache(data.sessions);
74
+ const outputPath = path.join(EXPORTS_BASE, dirName, 'markdown');
75
+ const result = await exportMarkdown(dirName, cache, data.sessions, outputPath);
76
+ res.json(result);
77
+ }
78
+ catch (err) {
79
+ console.error('[save-local]', err.message);
80
+ res.status(500).json({ error: 'Save local failed' });
81
+ }
82
+ });
83
+ router.post('/api/projects/:project/export-markdown', async (req, res) => {
84
+ try {
85
+ const dirName = String(req.params.project);
86
+ const outputPath = req.body?.outputPath;
87
+ const data = await loadProjectData(ctx, dirName);
88
+ if (!data) {
89
+ res.status(404).json({ error: 'Project not found' });
90
+ return;
91
+ }
92
+ const cache = data.enhanceCache ?? buildFallbackCache(data.sessions);
93
+ const outDir = safeExportPath(outputPath, dirName, 'markdown');
94
+ const result = await exportMarkdown(dirName, cache, data.sessions, outDir);
95
+ res.json(result);
96
+ }
97
+ catch (err) {
98
+ console.error('[export-markdown]', err.message);
99
+ res.status(500).json({ error: 'Markdown export failed' });
100
+ }
101
+ });
102
+ router.post('/api/projects/:project/export-html', async (req, res) => {
103
+ try {
104
+ const dirName = String(req.params.project);
105
+ const outputPath = req.body?.outputPath;
106
+ const data = await loadProjectData(ctx, dirName);
107
+ if (!data) {
108
+ res.status(404).json({ error: 'Project not found' });
109
+ return;
110
+ }
111
+ const cache = data.enhanceCache ?? buildFallbackCache(data.sessions);
112
+ const totalFilesChanged = data.project.totalFiles;
113
+ const outDir = safeExportPath(outputPath, dirName, 'html');
114
+ const result = await exportHtml(dirName, cache, data.sessions, outDir, 'local', { totalFilesChanged });
115
+ res.json(result);
116
+ }
117
+ catch (err) {
118
+ console.error('[export-html]', err.message);
119
+ res.status(500).json({ error: 'HTML export failed' });
120
+ }
121
+ });
122
+ // Download HTML as zip (no disk writes)
123
+ router.get('/api/projects/:project/download-html', async (req, res) => {
124
+ try {
125
+ const dirName = String(req.params.project);
126
+ const data = await loadProjectData(ctx, dirName);
127
+ if (!data) {
128
+ res.status(404).json({ error: 'Project not found' });
129
+ return;
130
+ }
131
+ const cache = data.enhanceCache ?? buildFallbackCache(data.sessions);
132
+ const totalFilesChanged = data.project.totalFiles;
133
+ const htmlFiles = generateHtmlFiles(dirName, cache, data.sessions, 'local', { totalFilesChanged });
134
+ const zipBuffer = createZipBuffer(htmlFiles);
135
+ const filename = `${dirName.replace(/[^a-zA-Z0-9_-]/g, '_')}.zip`;
136
+ res.setHeader('Content-Type', 'application/zip');
137
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
138
+ res.setHeader('Content-Length', zipBuffer.length);
139
+ res.send(zipBuffer);
140
+ }
141
+ catch (err) {
142
+ console.error('[download-html]', err.message);
143
+ res.status(500).json({ error: 'HTML download failed' });
144
+ }
145
+ });
146
+ // Download Markdown as zip (no disk writes)
147
+ router.get('/api/projects/:project/download-markdown', async (req, res) => {
148
+ try {
149
+ const dirName = String(req.params.project);
150
+ const data = await loadProjectData(ctx, dirName);
151
+ if (!data) {
152
+ res.status(404).json({ error: 'Project not found' });
153
+ return;
154
+ }
155
+ const cache = data.enhanceCache ?? buildFallbackCache(data.sessions);
156
+ // Re-use exportMarkdown to a temp dir, then zip the result
157
+ const tmpDir = path.join(EXPORTS_BASE, '.tmp', `${dirName}-${Date.now()}`);
158
+ const result = await exportMarkdown(dirName, cache, data.sessions, tmpDir);
159
+ // Read files into memory and zip
160
+ const entries = result.files.map((filePath) => ({
161
+ path: path.relative(tmpDir, filePath),
162
+ content: fs.readFileSync(filePath, 'utf-8'),
163
+ }));
164
+ const zipBuffer = createZipBuffer(entries);
165
+ // Clean up temp dir
166
+ fs.rmSync(tmpDir, { recursive: true, force: true });
167
+ const filename = `${dirName.replace(/[^a-zA-Z0-9_-]/g, '_')}-markdown.zip`;
168
+ res.setHeader('Content-Type', 'application/zip');
169
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
170
+ res.setHeader('Content-Length', zipBuffer.length);
171
+ res.send(zipBuffer);
172
+ }
173
+ catch (err) {
174
+ console.error('[download-markdown]', err.message);
175
+ res.status(500).json({ error: 'Markdown download failed' });
176
+ }
177
+ });
178
+ // Download JSON (structured project + session data)
179
+ router.get('/api/projects/:project/download-json', async (req, res) => {
180
+ try {
181
+ const dirName = String(req.params.project);
182
+ const data = await loadProjectData(ctx, dirName);
183
+ if (!data) {
184
+ res.status(404).json({ error: 'Project not found' });
185
+ return;
186
+ }
187
+ const payload = {
188
+ ...data,
189
+ exportedAt: new Date().toISOString(),
190
+ };
191
+ const json = JSON.stringify(payload, null, 2);
192
+ const filename = `${dirName.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`;
193
+ res.setHeader('Content-Type', 'application/json');
194
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
195
+ res.send(json);
196
+ }
197
+ catch (err) {
198
+ console.error('[download-json]', err.message);
199
+ res.status(500).json({ error: 'JSON download failed' });
200
+ }
201
+ });
202
+ // Open directory (macOS) — restricted to the exports directory
203
+ router.post('/api/open-directory', (req, res) => {
204
+ try {
205
+ const dirPath = req.body?.path;
206
+ if (!dirPath || typeof dirPath !== 'string') {
207
+ res.status(400).json({ error: 'Missing path' });
208
+ return;
209
+ }
210
+ const resolved = path.resolve(dirPath);
211
+ if (!resolved.startsWith(EXPORTS_BASE)) {
212
+ res.status(403).json({ error: 'Path outside allowed directory' });
213
+ return;
214
+ }
215
+ if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {
216
+ res.status(400).json({ error: 'Path is not an existing directory' });
217
+ return;
218
+ }
219
+ execFileSync('open', [resolved]);
220
+ res.json({ ok: true });
221
+ }
222
+ catch (err) {
223
+ console.error('[open-directory]', err.message);
224
+ res.status(500).json({ error: 'Failed to open directory' });
225
+ }
226
+ });
227
+ return router;
228
+ }
229
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/routes/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { createRouteContext, type RouteContext } from './context.js';
2
+ export { createProjectsRouter } from './projects.js';
3
+ export { createEnhanceRouter } from './enhance.js';
4
+ export { createPublishRouter } from './publish.js';
5
+ export { createSearchRouter } from './search.js';
6
+ export { createSessionsRouter } from './sessions.js';
7
+ export { createArchiveRouter } from './archive.js';
8
+ export { createAuthRouter } from './auth.js';
9
+ export { createSettingsRouter } from './settings.js';
10
+ export { createExportRouter } from './export.js';
11
+ export { createPreviewRouter } from './preview.js';
12
+ export { createDashboardRouter } from './dashboard.js';
@@ -0,0 +1,13 @@
1
+ export { createRouteContext } from './context.js';
2
+ export { createProjectsRouter } from './projects.js';
3
+ export { createEnhanceRouter } from './enhance.js';
4
+ export { createPublishRouter } from './publish.js';
5
+ export { createSearchRouter } from './search.js';
6
+ export { createSessionsRouter } from './sessions.js';
7
+ export { createArchiveRouter } from './archive.js';
8
+ export { createAuthRouter } from './auth.js';
9
+ export { createSettingsRouter } from './settings.js';
10
+ export { createExportRouter } from './export.js';
11
+ export { createPreviewRouter } from './preview.js';
12
+ export { createDashboardRouter } from './dashboard.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Router } from 'express';
2
+ import { type RouteContext } from './context.js';
3
+ export declare function createPreviewRouter(ctx: RouteContext): Router;