heyiam 0.1.7 → 0.1.8

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 (136) 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 -1
  15. package/dist/config.js +2 -2
  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 +118 -0
  24. package/dist/db.js +444 -0
  25. package/dist/db.js.map +1 -0
  26. package/dist/export.d.ts +30 -0
  27. package/dist/export.js +377 -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.js +1 -1
  35. package/dist/parsers/claude.js +73 -0
  36. package/dist/parsers/claude.js.map +1 -1
  37. package/dist/parsers/codex.js +1 -1
  38. package/dist/parsers/codex.js.map +1 -1
  39. package/dist/parsers/cursor.d.ts +2 -0
  40. package/dist/parsers/cursor.js +14 -26
  41. package/dist/parsers/cursor.js.map +1 -1
  42. package/dist/parsers/gemini.d.ts +3 -2
  43. package/dist/parsers/gemini.js +198 -21
  44. package/dist/parsers/gemini.js.map +1 -1
  45. package/dist/parsers/index.d.ts +1 -1
  46. package/dist/parsers/index.js +23 -7
  47. package/dist/parsers/index.js.map +1 -1
  48. package/dist/parsers/types.d.ts +27 -1
  49. package/dist/render/build-render-data.d.ts +59 -0
  50. package/dist/render/build-render-data.js +101 -0
  51. package/dist/render/build-render-data.js.map +1 -0
  52. package/dist/render/components/PortfolioPage.d.ts +4 -0
  53. package/dist/render/components/PortfolioPage.js +16 -0
  54. package/dist/render/components/PortfolioPage.js.map +1 -0
  55. package/dist/render/components/ProjectPage.d.ts +4 -0
  56. package/dist/render/components/ProjectPage.js +101 -0
  57. package/dist/render/components/ProjectPage.js.map +1 -0
  58. package/dist/render/components/SessionPage.d.ts +4 -0
  59. package/dist/render/components/SessionPage.js +29 -0
  60. package/dist/render/components/SessionPage.js.map +1 -0
  61. package/dist/render/index.d.ts +37 -0
  62. package/dist/render/index.js +140 -0
  63. package/dist/render/index.js.map +1 -0
  64. package/dist/render/types.d.ts +121 -0
  65. package/dist/render/types.js +9 -0
  66. package/dist/render/types.js.map +1 -0
  67. package/dist/routes/archive.d.ts +3 -0
  68. package/dist/routes/archive.js +56 -0
  69. package/dist/routes/archive.js.map +1 -0
  70. package/dist/routes/auth.d.ts +3 -0
  71. package/dist/routes/auth.js +116 -0
  72. package/dist/routes/auth.js.map +1 -0
  73. package/dist/routes/context.d.ts +61 -0
  74. package/dist/routes/context.js +356 -0
  75. package/dist/routes/context.js.map +1 -0
  76. package/dist/routes/dashboard.d.ts +3 -0
  77. package/dist/routes/dashboard.js +103 -0
  78. package/dist/routes/dashboard.js.map +1 -0
  79. package/dist/routes/enhance.d.ts +3 -0
  80. package/dist/routes/enhance.js +305 -0
  81. package/dist/routes/enhance.js.map +1 -0
  82. package/dist/routes/export.d.ts +3 -0
  83. package/dist/routes/export.js +145 -0
  84. package/dist/routes/export.js.map +1 -0
  85. package/dist/routes/index.d.ts +12 -0
  86. package/dist/routes/index.js +13 -0
  87. package/dist/routes/index.js.map +1 -0
  88. package/dist/routes/preview.d.ts +3 -0
  89. package/dist/routes/preview.js +191 -0
  90. package/dist/routes/preview.js.map +1 -0
  91. package/dist/routes/projects.d.ts +3 -0
  92. package/dist/routes/projects.js +356 -0
  93. package/dist/routes/projects.js.map +1 -0
  94. package/dist/routes/publish.d.ts +3 -0
  95. package/dist/routes/publish.js +466 -0
  96. package/dist/routes/publish.js.map +1 -0
  97. package/dist/routes/search.d.ts +3 -0
  98. package/dist/routes/search.js +110 -0
  99. package/dist/routes/search.js.map +1 -0
  100. package/dist/routes/sessions.d.ts +3 -0
  101. package/dist/routes/sessions.js +103 -0
  102. package/dist/routes/sessions.js.map +1 -0
  103. package/dist/routes/settings.d.ts +3 -0
  104. package/dist/routes/settings.js +30 -0
  105. package/dist/routes/settings.js.map +1 -0
  106. package/dist/screenshot.d.ts +5 -2
  107. package/dist/screenshot.js +187 -13
  108. package/dist/screenshot.js.map +1 -1
  109. package/dist/search.d.ts +30 -0
  110. package/dist/search.js +153 -0
  111. package/dist/search.js.map +1 -0
  112. package/dist/server.d.ts +1 -1
  113. package/dist/server.js +55 -1318
  114. package/dist/server.js.map +1 -1
  115. package/dist/settings.d.ts +23 -6
  116. package/dist/settings.js +36 -12
  117. package/dist/settings.js.map +1 -1
  118. package/dist/source-audit.d.ts +29 -0
  119. package/dist/source-audit.js +203 -0
  120. package/dist/source-audit.js.map +1 -0
  121. package/dist/sync.d.ts +74 -0
  122. package/dist/sync.js +358 -0
  123. package/dist/sync.js.map +1 -0
  124. package/dist/transcript.d.ts +68 -0
  125. package/dist/transcript.js +268 -0
  126. package/dist/transcript.js.map +1 -0
  127. package/package.json +5 -1
  128. package/app/dist/assets/html2canvas-Cwn_rrOw.js +0 -5
  129. package/app/dist/assets/index-CEQyTkgN.js +0 -14
  130. package/app/dist/assets/index-DLh5xRE8.css +0 -1
  131. package/app/dist/favicon.svg +0 -5
  132. package/app/dist/icons.svg +0 -24
  133. package/app/dist/index.html +0 -20
  134. package/dist/machine-key.d.ts +0 -10
  135. package/dist/machine-key.js +0 -51
  136. 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,145 @@
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 { parseSession } from '../parsers/index.js';
6
+ import { bridgeToAnalyzer } from '../bridge.js';
7
+ import { analyzeSession } from '../analyzer.js';
8
+ import { loadProjectEnhanceResult } from '../settings.js';
9
+ import { exportMarkdown, exportHtml, generateHtmlFiles, createZipBuffer } from '../export.js';
10
+ const EXPORTS_BASE = path.resolve(process.env.HOME || '~', '.config', 'heyiam', 'exports');
11
+ /** Validate that an output path is within the safe exports directory. */
12
+ function safeExportPath(outputPath, dirName, format) {
13
+ const defaultPath = path.join(EXPORTS_BASE, dirName, format);
14
+ if (!outputPath)
15
+ return defaultPath;
16
+ const resolved = path.resolve(outputPath);
17
+ if (!resolved.startsWith(EXPORTS_BASE))
18
+ return defaultPath;
19
+ return resolved;
20
+ }
21
+ async function loadProjectSessions(ctx, dirName) {
22
+ const projects = await ctx.getProjects();
23
+ const proj = projects.find((p) => p.dirName === dirName);
24
+ if (!proj)
25
+ return [];
26
+ const sessions = [];
27
+ for (const meta of proj.sessions) {
28
+ try {
29
+ const parsed = await parseSession(meta.path);
30
+ const bridged = bridgeToAnalyzer(parsed, { sessionId: meta.sessionId, projectName: proj.name });
31
+ sessions.push(analyzeSession(bridged));
32
+ }
33
+ catch { /* skip unparseable sessions */ }
34
+ }
35
+ return sessions;
36
+ }
37
+ export function createExportRouter(ctx) {
38
+ const router = Router();
39
+ router.post('/api/projects/:project/save-local', async (req, res) => {
40
+ try {
41
+ const dirName = String(req.params.project);
42
+ const cache = loadProjectEnhanceResult(dirName);
43
+ if (!cache) {
44
+ res.status(404).json({ error: 'No enhance result found' });
45
+ return;
46
+ }
47
+ const sessions = await loadProjectSessions(ctx, dirName);
48
+ const outputPath = path.join(EXPORTS_BASE, dirName, 'markdown');
49
+ const result = await exportMarkdown(dirName, cache, sessions, outputPath);
50
+ res.json(result);
51
+ }
52
+ catch (err) {
53
+ console.error('[save-local]', err.message);
54
+ res.status(500).json({ error: 'Save local failed' });
55
+ }
56
+ });
57
+ router.post('/api/projects/:project/export-markdown', async (req, res) => {
58
+ try {
59
+ const dirName = String(req.params.project);
60
+ const outputPath = req.body?.outputPath;
61
+ const cache = loadProjectEnhanceResult(dirName);
62
+ if (!cache) {
63
+ res.status(404).json({ error: 'No enhance result found' });
64
+ return;
65
+ }
66
+ const sessions = await loadProjectSessions(ctx, dirName);
67
+ const outDir = safeExportPath(outputPath, dirName, 'markdown');
68
+ const result = await exportMarkdown(dirName, cache, sessions, outDir);
69
+ res.json(result);
70
+ }
71
+ catch (err) {
72
+ console.error('[export-markdown]', err.message);
73
+ res.status(500).json({ error: 'Markdown export failed' });
74
+ }
75
+ });
76
+ router.post('/api/projects/:project/export-html', async (req, res) => {
77
+ try {
78
+ const dirName = String(req.params.project);
79
+ const outputPath = req.body?.outputPath;
80
+ const cache = loadProjectEnhanceResult(dirName);
81
+ if (!cache) {
82
+ res.status(404).json({ error: 'No enhance result found' });
83
+ return;
84
+ }
85
+ const sessions = await loadProjectSessions(ctx, dirName);
86
+ const outDir = safeExportPath(outputPath, dirName, 'html');
87
+ const result = await exportHtml(dirName, cache, sessions, outDir);
88
+ res.json(result);
89
+ }
90
+ catch (err) {
91
+ console.error('[export-html]', err.message);
92
+ res.status(500).json({ error: 'HTML export failed' });
93
+ }
94
+ });
95
+ // Download HTML as zip (no disk writes)
96
+ router.get('/api/projects/:project/download-html', async (req, res) => {
97
+ try {
98
+ const dirName = String(req.params.project);
99
+ const cache = loadProjectEnhanceResult(dirName);
100
+ if (!cache) {
101
+ res.status(404).json({ error: 'No enhance result found' });
102
+ return;
103
+ }
104
+ const sessions = await loadProjectSessions(ctx, dirName);
105
+ const htmlFiles = generateHtmlFiles(dirName, cache, sessions);
106
+ const zipBuffer = createZipBuffer(htmlFiles);
107
+ const filename = `${dirName.replace(/[^a-zA-Z0-9_-]/g, '_')}.zip`;
108
+ res.setHeader('Content-Type', 'application/zip');
109
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
110
+ res.setHeader('Content-Length', zipBuffer.length);
111
+ res.send(zipBuffer);
112
+ }
113
+ catch (err) {
114
+ console.error('[download-html]', err.message);
115
+ res.status(500).json({ error: 'HTML download failed' });
116
+ }
117
+ });
118
+ // Open directory (macOS) — restricted to the exports directory
119
+ router.post('/api/open-directory', (req, res) => {
120
+ try {
121
+ const dirPath = req.body?.path;
122
+ if (!dirPath || typeof dirPath !== 'string') {
123
+ res.status(400).json({ error: 'Missing path' });
124
+ return;
125
+ }
126
+ const resolved = path.resolve(dirPath);
127
+ if (!resolved.startsWith(EXPORTS_BASE)) {
128
+ res.status(403).json({ error: 'Path outside allowed directory' });
129
+ return;
130
+ }
131
+ if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {
132
+ res.status(400).json({ error: 'Path is not an existing directory' });
133
+ return;
134
+ }
135
+ execFileSync('open', [resolved]);
136
+ res.json({ ok: true });
137
+ }
138
+ catch (err) {
139
+ console.error('[open-directory]', err.message);
140
+ res.status(500).json({ error: 'Failed to open directory' });
141
+ }
142
+ });
143
+ return router;
144
+ }
145
+ //# 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;