heyiam 0.2.17 → 0.2.18

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 (162) hide show
  1. package/dist/analyzer.js +0 -1
  2. package/dist/archive.js +0 -1
  3. package/dist/auth.js +0 -1
  4. package/dist/autostart.js +0 -1
  5. package/dist/bridge.js +0 -1
  6. package/dist/config.js +0 -1
  7. package/dist/context-export.js +0 -1
  8. package/dist/daemon-install.js +0 -1
  9. package/dist/db.js +0 -1
  10. package/dist/demo-data.js +0 -1
  11. package/dist/demo-seed.js +0 -1
  12. package/dist/export.js +0 -1
  13. package/dist/format-utils.js +0 -1
  14. package/dist/index.js +0 -1
  15. package/dist/llm/anthropic-provider.js +0 -1
  16. package/dist/llm/index.js +0 -1
  17. package/dist/llm/project-enhance.js +0 -1
  18. package/dist/llm/proxy-provider.js +0 -1
  19. package/dist/llm/triage.js +0 -1
  20. package/dist/llm/types.js +0 -1
  21. package/dist/parsers/claude.js +0 -1
  22. package/dist/parsers/codex.js +0 -1
  23. package/dist/parsers/cursor.js +0 -1
  24. package/dist/parsers/gemini.js +0 -1
  25. package/dist/parsers/index.js +0 -1
  26. package/dist/parsers/types.js +0 -1
  27. package/dist/redact.js +0 -1
  28. package/dist/render/build-render-data.js +0 -1
  29. package/dist/render/index.js +0 -1
  30. package/dist/render/liquid.js +0 -1
  31. package/dist/render/templates/project.liquid +28 -14
  32. package/dist/render/templates/styles.css +31 -1
  33. package/dist/render/types.js +0 -1
  34. package/dist/routes/archive.js +0 -1
  35. package/dist/routes/auth.js +0 -1
  36. package/dist/routes/context.js +0 -1
  37. package/dist/routes/dashboard.js +0 -1
  38. package/dist/routes/enhance.js +0 -1
  39. package/dist/routes/export.js +0 -1
  40. package/dist/routes/index.js +0 -1
  41. package/dist/routes/preview.js +0 -1
  42. package/dist/routes/projects.js +0 -1
  43. package/dist/routes/publish.js +4 -2
  44. package/dist/routes/search.js +0 -1
  45. package/dist/routes/sessions.js +0 -1
  46. package/dist/routes/settings.js +0 -1
  47. package/dist/screenshot.js +0 -1
  48. package/dist/search.js +0 -1
  49. package/dist/server.js +2 -2
  50. package/dist/settings.js +0 -1
  51. package/dist/source-audit.js +0 -1
  52. package/dist/summarize.js +0 -1
  53. package/dist/sync.js +0 -1
  54. package/dist/transcript.js +0 -1
  55. package/package.json +6 -3
  56. package/dist/analyzer.d.ts +0 -123
  57. package/dist/analyzer.js.map +0 -1
  58. package/dist/archive.d.ts +0 -14
  59. package/dist/archive.js.map +0 -1
  60. package/dist/auth.d.ts +0 -28
  61. package/dist/auth.js.map +0 -1
  62. package/dist/autostart.d.ts +0 -19
  63. package/dist/autostart.js.map +0 -1
  64. package/dist/bridge.d.ts +0 -58
  65. package/dist/bridge.js.map +0 -1
  66. package/dist/config.d.ts +0 -2
  67. package/dist/config.js.map +0 -1
  68. package/dist/context-export.d.ts +0 -28
  69. package/dist/context-export.js.map +0 -1
  70. package/dist/daemon-install.d.ts +0 -23
  71. package/dist/daemon-install.js.map +0 -1
  72. package/dist/db.d.ts +0 -126
  73. package/dist/db.js.map +0 -1
  74. package/dist/demo-data.d.ts +0 -95
  75. package/dist/demo-data.js.map +0 -1
  76. package/dist/demo-seed.d.ts +0 -17
  77. package/dist/demo-seed.js.map +0 -1
  78. package/dist/export.d.ts +0 -34
  79. package/dist/export.js.map +0 -1
  80. package/dist/format-utils.d.ts +0 -6
  81. package/dist/format-utils.js.map +0 -1
  82. package/dist/index.d.ts +0 -4
  83. package/dist/index.js.map +0 -1
  84. package/dist/llm/anthropic-provider.d.ts +0 -11
  85. package/dist/llm/anthropic-provider.js.map +0 -1
  86. package/dist/llm/index.d.ts +0 -16
  87. package/dist/llm/index.js.map +0 -1
  88. package/dist/llm/project-enhance.d.ts +0 -72
  89. package/dist/llm/project-enhance.js.map +0 -1
  90. package/dist/llm/proxy-provider.d.ts +0 -16
  91. package/dist/llm/proxy-provider.js.map +0 -1
  92. package/dist/llm/triage.d.ts +0 -67
  93. package/dist/llm/triage.js.map +0 -1
  94. package/dist/llm/types.d.ts +0 -19
  95. package/dist/llm/types.js.map +0 -1
  96. package/dist/parsers/claude.d.ts +0 -18
  97. package/dist/parsers/claude.js.map +0 -1
  98. package/dist/parsers/codex.d.ts +0 -8
  99. package/dist/parsers/codex.js.map +0 -1
  100. package/dist/parsers/cursor.d.ts +0 -91
  101. package/dist/parsers/cursor.js.map +0 -1
  102. package/dist/parsers/gemini.d.ts +0 -29
  103. package/dist/parsers/gemini.js.map +0 -1
  104. package/dist/parsers/index.d.ts +0 -49
  105. package/dist/parsers/index.js.map +0 -1
  106. package/dist/parsers/types.d.ts +0 -123
  107. package/dist/parsers/types.js.map +0 -1
  108. package/dist/redact.d.ts +0 -31
  109. package/dist/redact.js.map +0 -1
  110. package/dist/render/build-render-data.d.ts +0 -60
  111. package/dist/render/build-render-data.js.map +0 -1
  112. package/dist/render/index.d.ts +0 -37
  113. package/dist/render/index.js.map +0 -1
  114. package/dist/render/liquid.d.ts +0 -19
  115. package/dist/render/liquid.js.map +0 -1
  116. package/dist/render/templates/templates/project.liquid +0 -225
  117. package/dist/render/templates/templates/session.liquid +0 -158
  118. package/dist/render/templates/templates/styles.css +0 -599
  119. package/dist/render/types.d.ts +0 -122
  120. package/dist/render/types.js.map +0 -1
  121. package/dist/routes/archive.d.ts +0 -3
  122. package/dist/routes/archive.js.map +0 -1
  123. package/dist/routes/auth.d.ts +0 -3
  124. package/dist/routes/auth.js.map +0 -1
  125. package/dist/routes/context.d.ts +0 -76
  126. package/dist/routes/context.js.map +0 -1
  127. package/dist/routes/dashboard.d.ts +0 -3
  128. package/dist/routes/dashboard.js.map +0 -1
  129. package/dist/routes/enhance.d.ts +0 -3
  130. package/dist/routes/enhance.js.map +0 -1
  131. package/dist/routes/export.d.ts +0 -3
  132. package/dist/routes/export.js.map +0 -1
  133. package/dist/routes/index.d.ts +0 -12
  134. package/dist/routes/index.js.map +0 -1
  135. package/dist/routes/preview.d.ts +0 -3
  136. package/dist/routes/preview.js.map +0 -1
  137. package/dist/routes/projects.d.ts +0 -3
  138. package/dist/routes/projects.js.map +0 -1
  139. package/dist/routes/publish.d.ts +0 -3
  140. package/dist/routes/publish.js.map +0 -1
  141. package/dist/routes/search.d.ts +0 -3
  142. package/dist/routes/search.js.map +0 -1
  143. package/dist/routes/sessions.d.ts +0 -3
  144. package/dist/routes/sessions.js.map +0 -1
  145. package/dist/routes/settings.d.ts +0 -3
  146. package/dist/routes/settings.js.map +0 -1
  147. package/dist/screenshot.d.ts +0 -13
  148. package/dist/screenshot.js.map +0 -1
  149. package/dist/search.d.ts +0 -30
  150. package/dist/search.js.map +0 -1
  151. package/dist/server.d.ts +0 -14
  152. package/dist/server.js.map +0 -1
  153. package/dist/settings.d.ts +0 -109
  154. package/dist/settings.js.map +0 -1
  155. package/dist/source-audit.d.ts +0 -29
  156. package/dist/source-audit.js.map +0 -1
  157. package/dist/summarize.d.ts +0 -65
  158. package/dist/summarize.js.map +0 -1
  159. package/dist/sync.d.ts +0 -78
  160. package/dist/sync.js.map +0 -1
  161. package/dist/transcript.d.ts +0 -68
  162. package/dist/transcript.js.map +0 -1
package/dist/analyzer.js CHANGED
@@ -256,4 +256,3 @@ export function analyzeSession(analysis) {
256
256
  ...(analysis.tokenUsage ? { tokenUsage: analysis.tokenUsage } : {}),
257
257
  };
258
258
  }
259
- //# sourceMappingURL=analyzer.js.map
package/dist/archive.js CHANGED
@@ -122,4 +122,3 @@ async function archiveFile(sourcePath, archiveBase, projectDir, result) {
122
122
  result.failed++;
123
123
  }
124
124
  }
125
- //# sourceMappingURL=archive.js.map
package/dist/auth.js CHANGED
@@ -96,4 +96,3 @@ export async function deviceAuthFlow(apiBaseUrl, configDir = getConfigDir(), opt
96
96
  function sleep(ms) {
97
97
  return new Promise((resolve) => setTimeout(resolve, ms));
98
98
  }
99
- //# sourceMappingURL=auth.js.map
package/dist/autostart.js CHANGED
@@ -100,4 +100,3 @@ export function unregisterAutostart() {
100
100
  }
101
101
  return { removed: removed.length > 0, files: removed };
102
102
  }
103
- //# sourceMappingURL=autostart.js.map
package/dist/bridge.js CHANGED
@@ -366,4 +366,3 @@ export function aggregateChildStats(children) {
366
366
  agentCount: children.length,
367
367
  };
368
368
  }
369
- //# sourceMappingURL=bridge.js.map
package/dist/config.js CHANGED
@@ -1,3 +1,2 @@
1
1
  /** Base URL for the heyiam.com app API. Override with HEYIAM_API_URL for local dev. */
2
2
  export const API_URL = process.env.HEYIAM_API_URL ?? 'https://heyiam.com';
3
- //# sourceMappingURL=config.js.map
@@ -353,4 +353,3 @@ export function exportSessionContext(session, turns, options = {}) {
353
353
  tier,
354
354
  };
355
355
  }
356
- //# sourceMappingURL=context-export.js.map
@@ -152,4 +152,3 @@ function formatBytes(bytes) {
152
152
  return `${(bytes / 1024).toFixed(1)} KB`;
153
153
  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
154
154
  }
155
- //# sourceMappingURL=daemon-install.js.map
package/dist/db.js CHANGED
@@ -522,4 +522,3 @@ export function getProjectUuid(db, projectDir) {
522
522
  db.prepare('INSERT INTO project_uuids (project_dir, uuid) VALUES (?, ?)').run(projectDir, uuid);
523
523
  return uuid;
524
524
  }
525
- //# sourceMappingURL=db.js.map
package/dist/demo-data.js CHANGED
@@ -1944,4 +1944,3 @@ export const DEMO_SOURCE_AUDIT = {
1944
1944
  },
1945
1945
  ],
1946
1946
  };
1947
- //# sourceMappingURL=demo-data.js.map
package/dist/demo-seed.js CHANGED
@@ -308,4 +308,3 @@ function hashStr(s) {
308
308
  h = ((h << 5) - h + s.charCodeAt(i)) | 0;
309
309
  return Math.abs(h);
310
310
  }
311
- //# sourceMappingURL=demo-seed.js.map
package/dist/export.js CHANGED
@@ -497,4 +497,3 @@ function buildStandalonePage(title, bodyHtml) {
497
497
  </body>
498
498
  </html>`;
499
499
  }
500
- //# sourceMappingURL=export.js.map
@@ -12,4 +12,3 @@ export function formatLoc(loc) {
12
12
  export function escapeLikeWildcards(str) {
13
13
  return str.replace(/[%_]/g, (c) => `\\${c}`);
14
14
  }
15
- //# sourceMappingURL=format-utils.js.map
package/dist/index.js CHANGED
@@ -689,4 +689,3 @@ if (isDirectRun) {
689
689
  process.exit(1);
690
690
  });
691
691
  }
692
- //# sourceMappingURL=index.js.map
@@ -13,4 +13,3 @@ export class AnthropicProvider {
13
13
  return summarizeSession(session, { client });
14
14
  }
15
15
  }
16
- //# sourceMappingURL=anthropic-provider.js.map
package/dist/llm/index.js CHANGED
@@ -22,4 +22,3 @@ export function getProvider() {
22
22
  export function getEnhanceMode() {
23
23
  return getAnthropicApiKey() ? 'local' : 'proxy';
24
24
  }
25
- //# sourceMappingURL=index.js.map
@@ -233,4 +233,3 @@ export async function refineNarrative(draftNarrative, draftTimeline, answers) {
233
233
  }
234
234
  return result;
235
235
  }
236
- //# sourceMappingURL=project-enhance.js.map
@@ -57,4 +57,3 @@ function sessionToPayload(session) {
57
57
  rawLog: session.rawLog,
58
58
  };
59
59
  }
60
- //# sourceMappingURL=proxy-provider.js.map
@@ -299,4 +299,3 @@ function buildScoreReason(signals) {
299
299
  parts.push('detailed explanations');
300
300
  return parts.length > 0 ? parts.join(', ') : 'Substantive session';
301
301
  }
302
- //# sourceMappingURL=triage.js.map
package/dist/llm/types.js CHANGED
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -374,4 +374,3 @@ export const claudeParser = {
374
374
  detect,
375
375
  parse,
376
376
  };
377
- //# sourceMappingURL=claude.js.map
@@ -303,4 +303,3 @@ export async function discoverCodexSessions() {
303
303
  }
304
304
  return results;
305
305
  }
306
- //# sourceMappingURL=codex.js.map
@@ -542,4 +542,3 @@ export const cursorParser = {
542
542
  detect,
543
543
  parse,
544
544
  };
545
- //# sourceMappingURL=cursor.js.map
@@ -391,4 +391,3 @@ export function resolveProjectDirs(sessions, knownDirs) {
391
391
  }
392
392
  // Re-exports for testing
393
393
  export { parseGeminiLog, groupBySession, analyzeSession, extractFileRefsFromText };
394
- //# sourceMappingURL=gemini.js.map
@@ -411,4 +411,3 @@ async function tryAddSession(fullPath, sessionId, projectDir, isSubagent, out, p
411
411
  console.log(`[discovery] No parser matched: ${fullPath}`);
412
412
  }
413
413
  }
414
- //# sourceMappingURL=index.js.map
@@ -41,4 +41,3 @@ export async function readFirstChunk(filePath) {
41
41
  await fh?.close();
42
42
  }
43
43
  }
44
- //# sourceMappingURL=types.js.map
package/dist/redact.js CHANGED
@@ -370,4 +370,3 @@ export function formatFindings(findings) {
370
370
  }
371
371
  return lines.join("\n");
372
372
  }
373
- //# sourceMappingURL=redact.js.map
@@ -99,4 +99,3 @@ export function buildProjectRenderData(opts) {
99
99
  sessionBaseUrl: opts.sessionBaseUrl,
100
100
  };
101
101
  }
102
- //# sourceMappingURL=build-render-data.js.map
@@ -101,4 +101,3 @@ export function renderSessionHtml(data) {
101
101
  throw new RenderError('RENDER_FAILED', `Failed to render session page for ${data.session.token}`, err);
102
102
  }
103
103
  }
104
- //# sourceMappingURL=index.js.map
@@ -156,4 +156,3 @@ export function renderProject(data, extras) {
156
156
  export function renderSession(data) {
157
157
  return engine.renderFileSync('session', data);
158
158
  }
159
- //# sourceMappingURL=liquid.js.map
@@ -45,13 +45,9 @@
45
45
  </div>
46
46
  {% endif %}
47
47
 
48
- {%- comment -%} Stats grid {%- endcomment -%}
49
- <div class="stat-grid">
50
- <div class="stat-card">
51
- <div class="stat-card__label">Sessions</div>
52
- <div class="stat-card__value">{{ project.totalSessions }}</div>
53
- </div>
54
- <div class="stat-card">
48
+ {%- comment -%} Stats: hero time card + compact grid {%- endcomment -%}
49
+ <div class="stat-hero-layout">
50
+ <div class="stat-card stat-card--hero">
55
51
  <div class="stat-card__label">{{ durationLabel }}</div>
56
52
  <div class="stat-card__value">
57
53
  {% if project.totalAgentDurationMinutes %}
@@ -60,14 +56,32 @@
60
56
  {{ project.totalDurationMinutes | formatDuration }}
61
57
  {% endif %}
62
58
  </div>
59
+ {% if efficiencyMultiplier %}
60
+ <div class="stat-card__sub">
61
+ <div class="stat-card__label">Efficiency multiplier</div>
62
+ <div class="stat-card__value stat-card__value--sm">{{ efficiencyMultiplier }}</div>
63
+ </div>
64
+ {% endif %}
63
65
  </div>
64
- <div class="stat-card">
65
- <div class="stat-card__label">Lines changed</div>
66
- <div class="stat-card__value">{{ project.totalLoc | formatLoc }}</div>
67
- </div>
68
- <div class="stat-card">
69
- <div class="stat-card__label">Files</div>
70
- <div class="stat-card__value">{{ project.totalFilesChanged }}</div>
66
+ <div class="stat-grid--compact">
67
+ <div class="stat-card">
68
+ <div class="stat-card__label">Sessions</div>
69
+ <div class="stat-card__value">{{ project.totalSessions }}</div>
70
+ </div>
71
+ <div class="stat-card">
72
+ <div class="stat-card__label">Lines changed</div>
73
+ <div class="stat-card__value">{{ project.totalLoc | formatLoc }}</div>
74
+ </div>
75
+ <div class="stat-card">
76
+ <div class="stat-card__label">Files</div>
77
+ <div class="stat-card__value">{{ project.totalFilesChanged }}</div>
78
+ </div>
79
+ {% if project.totalTokens %}
80
+ <div class="stat-card">
81
+ <div class="stat-card__label">Tokens</div>
82
+ <div class="stat-card__value">{{ project.totalTokens | formatTokens }}</div>
83
+ </div>
84
+ {% endif %}
71
85
  </div>
72
86
  </div>
73
87
 
@@ -75,9 +75,38 @@ a:hover { text-decoration: underline; }
75
75
  color: var(--on-surface-variant);
76
76
  }
77
77
 
78
+ .stat-hero-layout {
79
+ display: grid;
80
+ grid-template-columns: 1fr 2fr;
81
+ gap: 0.75rem;
82
+ margin-bottom: 1rem;
83
+ }
84
+
85
+ .stat-grid--compact {
86
+ display: grid;
87
+ grid-template-columns: repeat(2, 1fr);
88
+ gap: 0.75rem;
89
+ }
90
+
91
+ .stat-card--hero {
92
+ display: flex;
93
+ flex-direction: column;
94
+ justify-content: space-between;
95
+ }
96
+
97
+ .stat-card__sub {
98
+ margin-top: 0.5rem;
99
+ padding-top: 0.5rem;
100
+ border-top: 1px solid var(--border);
101
+ }
102
+
103
+ .stat-card__value--sm {
104
+ font-size: 1.25rem;
105
+ }
106
+
78
107
  .stat-grid {
79
108
  display: grid;
80
- grid-template-columns: repeat(4, 1fr);
109
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
81
110
  gap: 0.75rem;
82
111
  margin-bottom: 1rem;
83
112
  }
@@ -562,6 +591,7 @@ a:hover { text-decoration: underline; }
562
591
  @media (max-width: 768px) {
563
592
  .session-layout { grid-template-columns: 1fr; }
564
593
  .session-sidebar { border-right: none; border-bottom: 1px solid var(--ghost); padding-right: 0; padding-bottom: 1rem; }
594
+ .stat-hero-layout { grid-template-columns: 1fr; }
565
595
  .stat-grid { grid-template-columns: repeat(2, 1fr); }
566
596
  .session-grid { grid-template-columns: 1fr; }
567
597
  .two-col { grid-template-columns: 1fr; }
@@ -6,4 +6,3 @@
6
6
  * in `app/src/types.ts` — the render pipeline owns its own contract.
7
7
  */
8
8
  export {};
9
- //# sourceMappingURL=types.js.map
@@ -132,4 +132,3 @@ async function verifyDir(dir, result) {
132
132
  }
133
133
  }
134
134
  }
135
- //# sourceMappingURL=archive.js.map
@@ -123,4 +123,3 @@ export function createAuthRouter(_ctx) {
123
123
  });
124
124
  return router;
125
125
  }
126
- //# sourceMappingURL=auth.js.map
@@ -507,4 +507,3 @@ export function createRouteContext(sessionsBasePath, dbPath) {
507
507
  buildPreviewPage,
508
508
  };
509
509
  }
510
- //# sourceMappingURL=context.js.map
@@ -101,4 +101,3 @@ export function createDashboardRouter(ctx) {
101
101
  });
102
102
  return router;
103
103
  }
104
- //# sourceMappingURL=dashboard.js.map
@@ -302,4 +302,3 @@ export function createEnhanceRouter(ctx) {
302
302
  });
303
303
  return router;
304
304
  }
305
- //# sourceMappingURL=enhance.js.map
@@ -226,4 +226,3 @@ export function createExportRouter(ctx) {
226
226
  });
227
227
  return router;
228
228
  }
229
- //# sourceMappingURL=export.js.map
@@ -10,4 +10,3 @@ export { createSettingsRouter } from './settings.js';
10
10
  export { createExportRouter } from './export.js';
11
11
  export { createPreviewRouter } from './preview.js';
12
12
  export { createDashboardRouter } from './dashboard.js';
13
- //# sourceMappingURL=index.js.map
@@ -191,4 +191,3 @@ export function createPreviewRouter(ctx) {
191
191
  });
192
192
  return router;
193
193
  }
194
- //# sourceMappingURL=preview.js.map
@@ -190,4 +190,3 @@ export function createProjectsRouter(ctx) {
190
190
  });
191
191
  return router;
192
192
  }
193
- //# sourceMappingURL=projects.js.map
@@ -15,7 +15,7 @@ export function createPublishRouter(ctx) {
15
15
  // Render project preview HTML
16
16
  router.post('/api/projects/:project/render-preview', async (req, res) => {
17
17
  try {
18
- const { username, slug, title, narrative, repoUrl, projectUrl, screenshotUrl, timeline, skills, totalSessions, totalLoc, totalDurationMinutes, totalAgentDurationMinutes, totalFilesChanged, sessionCards, } = req.body;
18
+ const { username, slug, title, narrative, repoUrl, projectUrl, screenshotUrl, timeline, skills, totalSessions, totalLoc, totalDurationMinutes, totalAgentDurationMinutes, totalFilesChanged, totalTokens, sessionCards, } = req.body;
19
19
  const renderData = buildProjectRenderData({
20
20
  username: username || 'preview',
21
21
  slug, title, narrative,
@@ -27,6 +27,7 @@ export function createPublishRouter(ctx) {
27
27
  totalDurationMinutes: totalDurationMinutes || 0,
28
28
  totalAgentDurationMinutes,
29
29
  totalFilesChanged: totalFilesChanged || 0,
30
+ totalTokens,
30
31
  sessionCards: sessionCards || [],
31
32
  });
32
33
  const html = renderProjectHtml(renderData);
@@ -430,6 +431,8 @@ export function createPublishRouter(ctx) {
430
431
  total_duration_minutes: totalDurationMinutes,
431
432
  total_agent_duration_minutes: totalAgentDurationMinutes || null,
432
433
  total_files_changed: totalFilesChanged,
434
+ total_input_tokens: req.body.totalInputTokens || null,
435
+ total_output_tokens: req.body.totalOutputTokens || null,
433
436
  skipped_sessions: skippedSessions,
434
437
  rendered_html: projectHtml,
435
438
  },
@@ -478,4 +481,3 @@ export function createPublishRouter(ctx) {
478
481
  });
479
482
  return router;
480
483
  }
481
- //# sourceMappingURL=publish.js.map
@@ -107,4 +107,3 @@ export function createSearchRouter(ctx) {
107
107
  });
108
108
  return router;
109
109
  }
110
- //# sourceMappingURL=search.js.map
@@ -122,4 +122,3 @@ export function createSessionsRouter(ctx) {
122
122
  });
123
123
  return router;
124
124
  }
125
- //# sourceMappingURL=sessions.js.map
@@ -27,4 +27,3 @@ export function createSettingsRouter(_ctx) {
27
27
  });
28
28
  return router;
29
29
  }
30
- //# sourceMappingURL=settings.js.map
@@ -251,4 +251,3 @@ export async function captureScreenshot(url, slug) {
251
251
  proc.kill();
252
252
  }
253
253
  }
254
- //# sourceMappingURL=screenshot.js.map
package/dist/search.js CHANGED
@@ -150,4 +150,3 @@ function getFileFilteredSessionIds(db, filePath) {
150
150
  const rows = db.prepare('SELECT DISTINCT session_id FROM session_files WHERE file_path LIKE ?').all(`%${filePath}%`);
151
151
  return new Set(rows.map((r) => r.session_id));
152
152
  }
153
- //# sourceMappingURL=search.js.map
package/dist/server.js CHANGED
@@ -111,7 +111,8 @@ export function createApp(sessionsBasePath, dbPath) {
111
111
  const indexPath = path.join(staticDir, 'index.html');
112
112
  app.get('/{*splat}', (_req, res) => {
113
113
  res.sendFile(indexPath, (err) => {
114
- if (err) {
114
+ if (err && !res.headersSent) {
115
+ console.error(`[spa] sendFile failed for ${indexPath}:`, err.message);
115
116
  res.status(404).send('Page not found');
116
117
  }
117
118
  });
@@ -155,4 +156,3 @@ export function startServer(port = 17845, options) {
155
156
  });
156
157
  });
157
158
  }
158
- //# sourceMappingURL=server.js.map
package/dist/settings.js CHANGED
@@ -183,4 +183,3 @@ export function getUploadedState(projectDirName, configDir) {
183
183
  return null;
184
184
  }
185
185
  }
186
- //# sourceMappingURL=settings.js.map
@@ -200,4 +200,3 @@ function formatRelativeTime(timestampMs) {
200
200
  const diffDays = Math.floor(diffHours / 24);
201
201
  return `${diffDays}d ago`;
202
202
  }
203
- //# sourceMappingURL=source-audit.js.map
package/dist/summarize.js CHANGED
@@ -289,4 +289,3 @@ function enforceWordLimit(str, maxWords) {
289
289
  // ── Exports for testing ──────────────────────────────────────
290
290
  export { buildSystemPrompt as _buildSystemPrompt, buildUserPrompt as _buildUserPrompt };
291
291
  // scoreTurn and sampleSession are already exported above
292
- //# sourceMappingURL=summarize.js.map
package/dist/sync.js CHANGED
@@ -370,4 +370,3 @@ export function startCursorPolling(db, intervalMs = 30_000) {
370
370
  lastSeen.clear();
371
371
  };
372
372
  }
373
- //# sourceMappingURL=sync.js.map
@@ -272,4 +272,3 @@ export function buildTranscriptResponse(entries, opts = {}) {
272
272
  },
273
273
  };
274
274
  }
275
- //# sourceMappingURL=transcript.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heyiam",
3
- "version": "0.2.17",
3
+ "version": "0.2.18",
4
4
  "description": "Turn AI coding sessions into portfolio case studies",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -22,8 +22,11 @@
22
22
  "dist"
23
23
  ],
24
24
  "scripts": {
25
- "build": "tsc && chmod +x dist/index.js && cp -r src/render/templates dist/render/templates && cd app && npx vite build && rm -rf ../dist/public && cp -r dist ../dist/public",
26
- "prepublishOnly": "npm run build && find dist -name '*.test.*' -delete",
25
+ "clean": "rm -rf dist",
26
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && chmod +x dist/index.js && cp -r src/render/templates dist/render/templates && cd app && npx vite build && rm -rf ../dist/public && cp -r dist ../dist/public",
27
+ "verify-build": "node -e \"const fs=require('fs'); const assert=require('assert'); const pkg=require('./package.json'); assert(fs.existsSync('dist/index.js'),'missing dist/index.js'); assert(fs.existsSync('dist/public/index.html'),'missing dist/public/index.html'); assert(fs.existsSync('dist/render/templates'),'missing templates'); const js=fs.readdirSync('dist/public/assets').filter(f=>f.endsWith('.js')); assert(js.length===1,'expected exactly 1 JS bundle, found '+js.length); const html=fs.readFileSync('dist/public/index.html','utf8'); assert(html.includes(js[0]),'index.html does not reference the JS bundle'); const tests=fs.readdirSync('dist',{recursive:true}).filter(f=>String(f).includes('.test.')); assert(tests.length===0,'test files found in dist: '+tests.join(', ')); console.log('Build verified: v'+pkg.version+' — dist/index.js + frontend + templates, 0 test files')\"",
28
+ "prepublishOnly": "npm run test:backend && npm run build && npm run verify-build",
29
+ "prepack": "npm run verify-build",
27
30
  "dev": "npx concurrently \"npm:dev:api\" \"npm:dev:app\"",
28
31
  "dev:api": "tsx watch src/index.ts open --no-open",
29
32
  "dev:app": "cd app && npm run dev",
@@ -1,123 +0,0 @@
1
- export interface ParsedTurn {
2
- timestamp: string;
3
- type: 'prompt' | 'response' | 'tool' | 'error' | 'thinking';
4
- content: string;
5
- toolName?: string;
6
- toolInput?: string;
7
- toolOutput?: string;
8
- }
9
- export interface ParsedFileChange {
10
- path: string;
11
- additions: number;
12
- deletions: number;
13
- }
14
- export interface SessionAnalysis {
15
- id: string;
16
- title: string;
17
- date: string;
18
- /** End time as ISO timestamp */
19
- endTime?: string;
20
- durationMinutes: number;
21
- /** Wall-clock minutes (first to last timestamp, includes idle) */
22
- wallClockMinutes?: number;
23
- projectName: string;
24
- /** Source tool: "claude", "cursor", "codex", "gemini", "antigravity" */
25
- source?: string;
26
- turns: ParsedTurn[];
27
- filesChanged: ParsedFileChange[];
28
- /** Authoritative total LOC (additions + deletions) from parser loc_stats */
29
- locTotal?: number;
30
- rawLog: string[];
31
- childAnalyses?: SessionAnalysis[];
32
- agentRole?: string;
33
- parentSessionId?: string | null;
34
- /** Working directory where the session was started */
35
- cwd?: string;
36
- /** Active time intervals as [startMs, endMs] pairs for overlap-aware project aggregation */
37
- activeIntervals?: [number, number][];
38
- /** Token usage from parser (input + output tokens) */
39
- tokenUsage?: {
40
- input: number;
41
- output: number;
42
- };
43
- }
44
- export interface ExecutionStep {
45
- stepNumber: number;
46
- title: string;
47
- description: string;
48
- type?: 'analysis' | 'implementation' | 'testing' | 'deployment' | 'decision';
49
- }
50
- export interface ToolUsage {
51
- tool: string;
52
- count: number;
53
- }
54
- export interface TurnEvent {
55
- timestamp: string;
56
- type: 'prompt' | 'response' | 'tool' | 'error' | 'thinking';
57
- content: string;
58
- }
59
- export interface FileChange {
60
- path: string;
61
- additions: number;
62
- deletions: number;
63
- }
64
- export interface AgentChild {
65
- sessionId: string;
66
- role: string;
67
- durationMinutes: number;
68
- linesOfCode: number;
69
- date?: string;
70
- }
71
- export interface Session {
72
- id: string;
73
- title: string;
74
- date: string;
75
- /** End time as ISO timestamp */
76
- endTime?: string;
77
- /** Active time in minutes (excludes idle gaps) */
78
- durationMinutes: number;
79
- /** Wall-clock time in minutes (first to last timestamp) */
80
- wallClockMinutes?: number;
81
- turns: number;
82
- linesOfCode: number;
83
- status: 'draft' | 'enhanced' | 'uploaded' | 'archived';
84
- projectName: string;
85
- rawLog: string[];
86
- skills: string[];
87
- executionPath: ExecutionStep[];
88
- toolBreakdown: ToolUsage[];
89
- filesChanged: FileChange[];
90
- turnTimeline: TurnEvent[];
91
- toolCalls: number;
92
- /** AI-generated fields (populated from enhanced data) */
93
- context?: string;
94
- developerTake?: string;
95
- qaPairs?: Array<{
96
- question: string;
97
- answer: string;
98
- }>;
99
- children?: AgentChild[];
100
- parentSessionId?: string | null;
101
- agentRole?: string;
102
- isOrchestrated?: boolean;
103
- /** Working directory where the session was started */
104
- cwd?: string;
105
- /** True when enhanced via bulk mode with auto-accepted AI suggestions */
106
- quickEnhanced?: boolean;
107
- /** Source tool: "claude", "cursor", "codex", "gemini", "antigravity" */
108
- source?: string;
109
- /** Active time intervals as [startMs, endMs] pairs for overlap-aware project aggregation */
110
- activeIntervals?: [number, number][];
111
- /** Token usage: input and output token counts */
112
- tokenUsage?: {
113
- input: number;
114
- output: number;
115
- };
116
- }
117
- export declare function extractSkills(analysis: SessionAnalysis): string[];
118
- export declare function computeToolBreakdown(turns: ParsedTurn[]): ToolUsage[];
119
- export declare function generateExecutionPath(turns: ParsedTurn[]): ExecutionStep[];
120
- export declare function buildTurnTimeline(turns: ParsedTurn[]): TurnEvent[];
121
- export declare function detectContext(analysis: SessionAnalysis): string | undefined;
122
- export declare function computeLinesOfCode(filesChanged: ParsedFileChange[]): number;
123
- export declare function analyzeSession(analysis: SessionAnalysis): Session;