heyiam 0.2.28 → 0.3.0

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 (177) hide show
  1. package/README.md +45 -0
  2. package/dist/config.js +10 -1
  3. package/dist/db.js +1 -2
  4. package/dist/export.js +40 -25
  5. package/dist/format-utils.js +5 -0
  6. package/dist/index.js +168 -0
  7. package/dist/mount.js +300 -102
  8. package/dist/parsers/claude.js +2 -28
  9. package/dist/parsers/codex.js +2 -26
  10. package/dist/parsers/cursor.js +2 -26
  11. package/dist/parsers/duration.js +35 -0
  12. package/dist/parsers/gemini.js +2 -20
  13. package/dist/parsers/types.js +0 -1
  14. package/dist/public/assets/index-BZ65TU_Y.js +40 -0
  15. package/dist/public/assets/index-CqCaW2cb.css +1 -0
  16. package/dist/public/index.html +2 -2
  17. package/dist/redact.js +4 -104
  18. package/dist/render/build-render-data.js +9 -2
  19. package/dist/render/index.js +32 -5
  20. package/dist/render/liquid.js +147 -7
  21. package/dist/render/mock-data.js +303 -0
  22. package/dist/render/templates/aurora/portfolio.liquid +204 -0
  23. package/dist/render/templates/aurora/project.liquid +260 -0
  24. package/dist/render/templates/aurora/session.liquid +223 -0
  25. package/dist/render/templates/aurora/styles.css +1178 -0
  26. package/dist/render/templates/bauhaus/portfolio.liquid +179 -0
  27. package/dist/render/templates/bauhaus/project.liquid +300 -0
  28. package/dist/render/templates/bauhaus/session.liquid +333 -0
  29. package/dist/render/templates/bauhaus/styles.css +1641 -0
  30. package/dist/render/templates/blueprint/portfolio.liquid +167 -0
  31. package/dist/render/templates/blueprint/project.liquid +286 -0
  32. package/dist/render/templates/blueprint/session.liquid +248 -0
  33. package/dist/render/templates/blueprint/styles.css +1285 -0
  34. package/dist/render/templates/canvas/portfolio.liquid +215 -0
  35. package/dist/render/templates/canvas/project.liquid +235 -0
  36. package/dist/render/templates/canvas/session.liquid +223 -0
  37. package/dist/render/templates/canvas/styles.css +1436 -0
  38. package/dist/render/templates/carbon/portfolio.liquid +170 -0
  39. package/dist/render/templates/carbon/project.liquid +249 -0
  40. package/dist/render/templates/carbon/session.liquid +190 -0
  41. package/dist/render/templates/carbon/styles.css +1091 -0
  42. package/dist/render/templates/chalk/portfolio.liquid +199 -0
  43. package/dist/render/templates/chalk/project.liquid +245 -0
  44. package/dist/render/templates/chalk/session.liquid +215 -0
  45. package/dist/render/templates/chalk/styles.css +1157 -0
  46. package/dist/render/templates/circuit/portfolio.liquid +162 -0
  47. package/dist/render/templates/circuit/project.liquid +247 -0
  48. package/dist/render/templates/circuit/session.liquid +205 -0
  49. package/dist/render/templates/circuit/styles.css +1403 -0
  50. package/dist/render/templates/cosmos/portfolio.liquid +232 -0
  51. package/dist/render/templates/cosmos/project.liquid +327 -0
  52. package/dist/render/templates/cosmos/session.liquid +239 -0
  53. package/dist/render/templates/cosmos/styles.css +1151 -0
  54. package/dist/render/templates/daylight/portfolio.liquid +217 -0
  55. package/dist/render/templates/daylight/project.liquid +229 -0
  56. package/dist/render/templates/daylight/session.liquid +219 -0
  57. package/dist/render/templates/daylight/styles.css +1311 -0
  58. package/dist/render/templates/editorial/portfolio.liquid +126 -0
  59. package/dist/render/templates/editorial/project.liquid +202 -0
  60. package/dist/render/templates/editorial/session.liquid +171 -0
  61. package/dist/render/templates/editorial/styles.css +822 -0
  62. package/dist/render/templates/ember/portfolio.liquid +318 -0
  63. package/dist/render/templates/ember/project.liquid +232 -0
  64. package/dist/render/templates/ember/session.liquid +202 -0
  65. package/dist/render/templates/ember/styles.css +1283 -0
  66. package/dist/render/templates/glacier/portfolio.liquid +271 -0
  67. package/dist/render/templates/glacier/project.liquid +288 -0
  68. package/dist/render/templates/glacier/session.liquid +217 -0
  69. package/dist/render/templates/glacier/styles.css +1200 -0
  70. package/dist/render/templates/grid/portfolio.liquid +265 -0
  71. package/dist/render/templates/grid/project.liquid +306 -0
  72. package/dist/render/templates/grid/session.liquid +260 -0
  73. package/dist/render/templates/grid/styles.css +1441 -0
  74. package/dist/render/templates/kinetic/portfolio.liquid +170 -0
  75. package/dist/render/templates/kinetic/project.liquid +242 -0
  76. package/dist/render/templates/kinetic/session.liquid +228 -0
  77. package/dist/render/templates/kinetic/styles.css +944 -0
  78. package/dist/render/templates/meridian/portfolio.liquid +255 -0
  79. package/dist/render/templates/meridian/project.liquid +376 -0
  80. package/dist/render/templates/meridian/session.liquid +298 -0
  81. package/dist/render/templates/meridian/styles.css +1369 -0
  82. package/dist/render/templates/minimal/portfolio.liquid +71 -0
  83. package/dist/render/templates/minimal/project.liquid +154 -0
  84. package/dist/render/templates/minimal/session.liquid +140 -0
  85. package/dist/render/templates/minimal/styles.css +525 -0
  86. package/dist/render/templates/mono/portfolio.liquid +291 -0
  87. package/dist/render/templates/mono/project.liquid +275 -0
  88. package/dist/render/templates/mono/session.liquid +276 -0
  89. package/dist/render/templates/mono/styles.css +1016 -0
  90. package/dist/render/templates/neon/portfolio.liquid +217 -0
  91. package/dist/render/templates/neon/project.liquid +225 -0
  92. package/dist/render/templates/neon/session.liquid +195 -0
  93. package/dist/render/templates/neon/styles.css +1265 -0
  94. package/dist/render/templates/noir/portfolio.liquid +137 -0
  95. package/dist/render/templates/noir/project.liquid +220 -0
  96. package/dist/render/templates/noir/session.liquid +241 -0
  97. package/dist/render/templates/noir/styles.css +1223 -0
  98. package/dist/render/templates/obsidian/portfolio.liquid +257 -0
  99. package/dist/render/templates/obsidian/project.liquid +280 -0
  100. package/dist/render/templates/obsidian/session.liquid +241 -0
  101. package/dist/render/templates/obsidian/styles.css +1401 -0
  102. package/dist/render/templates/paper/portfolio.liquid +267 -0
  103. package/dist/render/templates/paper/project.liquid +235 -0
  104. package/dist/render/templates/paper/session.liquid +271 -0
  105. package/dist/render/templates/paper/styles.css +1509 -0
  106. package/dist/render/templates/parallax/portfolio.liquid +305 -0
  107. package/dist/render/templates/parallax/project.liquid +275 -0
  108. package/dist/render/templates/parallax/session.liquid +295 -0
  109. package/dist/render/templates/parallax/styles.css +1874 -0
  110. package/dist/render/templates/parchment/portfolio.liquid +290 -0
  111. package/dist/render/templates/parchment/project.liquid +289 -0
  112. package/dist/render/templates/parchment/session.liquid +346 -0
  113. package/dist/render/templates/parchment/styles.css +1397 -0
  114. package/dist/render/templates/partials/_beats.liquid +16 -0
  115. package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
  116. package/dist/render/templates/partials/_footer.liquid +7 -0
  117. package/dist/render/templates/partials/_growth-chart.liquid +7 -0
  118. package/dist/render/templates/partials/_key-decisions.liquid +20 -0
  119. package/dist/render/templates/partials/_links.liquid +16 -0
  120. package/dist/render/templates/partials/_narrative.liquid +8 -0
  121. package/dist/render/templates/partials/_phases.liquid +20 -0
  122. package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
  123. package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
  124. package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
  125. package/dist/render/templates/partials/_qa.liquid +13 -0
  126. package/dist/render/templates/partials/_screenshot.liquid +15 -0
  127. package/dist/render/templates/partials/_session-cards.liquid +30 -0
  128. package/dist/render/templates/partials/_session-header.liquid +39 -0
  129. package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
  130. package/dist/render/templates/partials/_skills.liquid +12 -0
  131. package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
  132. package/dist/render/templates/partials/_stats.liquid +38 -0
  133. package/dist/render/templates/partials/_work-timeline.liquid +7 -0
  134. package/dist/render/templates/project.liquid +7 -4
  135. package/dist/render/templates/radar/portfolio.liquid +233 -0
  136. package/dist/render/templates/radar/project.liquid +278 -0
  137. package/dist/render/templates/radar/session.liquid +300 -0
  138. package/dist/render/templates/radar/styles.css +1049 -0
  139. package/dist/render/templates/showcase/portfolio.liquid +231 -0
  140. package/dist/render/templates/showcase/project.liquid +237 -0
  141. package/dist/render/templates/showcase/session.liquid +210 -0
  142. package/dist/render/templates/showcase/styles.css +1279 -0
  143. package/dist/render/templates/signal/portfolio.liquid +227 -0
  144. package/dist/render/templates/signal/project.liquid +278 -0
  145. package/dist/render/templates/signal/session.liquid +282 -0
  146. package/dist/render/templates/signal/styles.css +1395 -0
  147. package/dist/render/templates/strata/portfolio.liquid +192 -0
  148. package/dist/render/templates/strata/project.liquid +282 -0
  149. package/dist/render/templates/strata/session.liquid +261 -0
  150. package/dist/render/templates/strata/styles.css +1350 -0
  151. package/dist/render/templates/styles.css +1190 -0
  152. package/dist/render/templates/terminal/portfolio.liquid +118 -0
  153. package/dist/render/templates/terminal/project.liquid +161 -0
  154. package/dist/render/templates/terminal/session.liquid +145 -0
  155. package/dist/render/templates/terminal/styles.css +492 -0
  156. package/dist/render/templates/verdant/portfolio.liquid +333 -0
  157. package/dist/render/templates/verdant/project.liquid +309 -0
  158. package/dist/render/templates/verdant/session.liquid +237 -0
  159. package/dist/render/templates/verdant/styles.css +1257 -0
  160. package/dist/render/templates/zen/portfolio.liquid +136 -0
  161. package/dist/render/templates/zen/project.liquid +187 -0
  162. package/dist/render/templates/zen/session.liquid +203 -0
  163. package/dist/render/templates/zen/styles.css +1207 -0
  164. package/dist/render/templates.js +90 -0
  165. package/dist/routes/context.js +15 -10
  166. package/dist/routes/enhance.js +17 -40
  167. package/dist/routes/export.js +14 -4
  168. package/dist/routes/preview.js +480 -108
  169. package/dist/routes/projects.js +11 -19
  170. package/dist/routes/publish.js +15 -17
  171. package/dist/routes/settings.js +94 -1
  172. package/dist/routes/sse.js +9 -0
  173. package/dist/server.js +8 -2
  174. package/dist/settings.js +17 -9
  175. package/package.json +2 -4
  176. package/dist/public/assets/index-B_d6DlEI.js +0 -21
  177. package/dist/public/assets/index-Dalqz2mC.css +0 -1
@@ -0,0 +1,298 @@
1
+ <div class="heyiam-session meridian" data-render-version="2" data-template="meridian">
2
+
3
+ {%- comment -%} Topographic contour background {%- endcomment -%}
4
+ <div class="topo-bg" aria-hidden="true">
5
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 900" preserveAspectRatio="xMidYMid slice">
6
+ <g class="topo-contours" fill="none" stroke-width="0.75">
7
+ <ellipse cx="350" cy="300" rx="280" ry="180" stroke="var(--mer-contour)" />
8
+ <ellipse cx="355" cy="305" rx="240" ry="150" stroke="var(--mer-contour)" />
9
+ <ellipse cx="360" cy="310" rx="200" ry="120" stroke="var(--mer-contour-strong)" />
10
+ <ellipse cx="365" cy="315" rx="160" ry="90" stroke="var(--mer-contour)" />
11
+ <ellipse cx="370" cy="320" rx="120" ry="65" stroke="var(--mer-contour-strong)" />
12
+ <ellipse cx="850" cy="550" rx="300" ry="200" stroke="var(--mer-contour)" />
13
+ <ellipse cx="845" cy="545" rx="250" ry="165" stroke="var(--mer-contour)" />
14
+ <ellipse cx="840" cy="540" rx="200" ry="130" stroke="var(--mer-contour-strong)" />
15
+ <ellipse cx="835" cy="535" rx="150" ry="95" stroke="var(--mer-contour)" />
16
+ <ellipse cx="950" cy="150" rx="220" ry="140" stroke="var(--mer-contour)" />
17
+ <ellipse cx="955" cy="155" rx="170" ry="105" stroke="var(--mer-contour-strong)" />
18
+ <ellipse cx="960" cy="160" rx="120" ry="70" stroke="var(--mer-contour)" />
19
+ <ellipse cx="150" cy="700" rx="250" ry="160" stroke="var(--mer-contour)" />
20
+ <ellipse cx="155" cy="695" rx="200" ry="125" stroke="var(--mer-contour-strong)" />
21
+ <ellipse cx="160" cy="690" rx="150" ry="90" stroke="var(--mer-contour)" />
22
+ </g>
23
+ </svg>
24
+ </div>
25
+
26
+ <a class="skip-link" href="#main-content">Skip to content</a>
27
+
28
+ <div class="mer-page">
29
+ <main id="main-content">
30
+
31
+ {%- comment -%} Breadcrumb {%- endcomment -%}
32
+ <nav class="breadcrumb" aria-label="Breadcrumb">
33
+ <a href="/{{ user.username }}">{{ user.username }}</a>
34
+ <span class="breadcrumb__sep">/</span>
35
+ <a href="/{{ user.username }}/{{ projectSlug }}">{{ projectSlug }}</a>
36
+ <span class="breadcrumb__sep">/</span>
37
+ <span aria-current="page">{{ session.title }}</span>
38
+ </nav>
39
+
40
+ {%- comment -%} Session Header {%- endcomment -%}
41
+ <header class="session-header section-reveal">
42
+ <div class="section-label">
43
+ <span>&#167;01 &mdash; waypoint detail</span>
44
+ </div>
45
+ <h1 class="session-header__title">{{ session.title }}</h1>
46
+ <div class="session-header__meta">
47
+ {% if session.recordedAt %}
48
+ <span class="session-header__meta-item">
49
+ <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
50
+ <span class="session-header__meta-value">{{ session.recordedAt | formatDate }}</span>
51
+ </span>
52
+ {% endif %}
53
+ {% if session.sourceTool %}
54
+ <span class="session-header__meta-item">
55
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
56
+ <span class="session-header__meta-value">{{ session.sourceTool }}</span>
57
+ </span>
58
+ {% endif %}
59
+ {% if session.durationMinutes %}
60
+ <span class="session-header__meta-item">
61
+ <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
62
+ <span class="session-header__meta-value">{{ session.durationMinutes | formatDuration }}</span>
63
+ {% if session.wallClockMinutes %}
64
+ <span>({{ session.wallClockMinutes | formatDuration }} wall)</span>
65
+ {% endif %}
66
+ </span>
67
+ {% endif %}
68
+ {% if session.locChanged %}
69
+ <span class="session-header__meta-item">
70
+ <svg viewBox="0 0 24 24" aria-hidden="true"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
71
+ <span class="session-header__meta-value">{{ session.locChanged | localeNumber }} LOC</span>
72
+ </span>
73
+ {% endif %}
74
+ </div>
75
+ </header>
76
+
77
+ {%- comment -%} Session Stats {%- endcomment -%}
78
+ <section class="session-stats section-reveal" aria-label="Session statistics">
79
+ {% if session.durationMinutes %}
80
+ <div class="stat-cell" role="group" aria-label="Duration">
81
+ <div class="stat-cell__coord">elapsed</div>
82
+ <div class="stat-cell__value">{{ session.durationMinutes | formatDuration }}</div>
83
+ <div class="stat-cell__label">active</div>
84
+ </div>
85
+ {% endif %}
86
+ {% if session.wallClockMinutes %}
87
+ <div class="stat-cell" role="group" aria-label="Wall clock time">
88
+ <div class="stat-cell__coord">wall</div>
89
+ <div class="stat-cell__value">{{ session.wallClockMinutes | formatDuration }}</div>
90
+ <div class="stat-cell__label">total</div>
91
+ </div>
92
+ {% endif %}
93
+ {% if session.turns %}
94
+ <div class="stat-cell" role="group" aria-label="Conversation turns">
95
+ <div class="stat-cell__coord">turns</div>
96
+ <div class="stat-cell__value">{{ session.turns }}</div>
97
+ <div class="stat-cell__label">exchanges</div>
98
+ </div>
99
+ {% endif %}
100
+ {% if session.locChanged %}
101
+ <div class="stat-cell" role="group" aria-label="Lines of code">
102
+ <div class="stat-cell__coord">datum</div>
103
+ <div class="stat-cell__value">{{ session.locChanged | localeNumber }}</div>
104
+ <div class="stat-cell__label">LOC</div>
105
+ </div>
106
+ {% endif %}
107
+ {% if session.filesChanged %}
108
+ <div class="stat-cell" role="group" aria-label="Files changed">
109
+ <div class="stat-cell__coord">feat</div>
110
+ <div class="stat-cell__value">{{ session.filesChanged }}</div>
111
+ <div class="stat-cell__label">files</div>
112
+ </div>
113
+ {% endif %}
114
+ </section>
115
+
116
+ {%- comment -%} Dev Take {%- endcomment -%}
117
+ {% if session.devTake != blank %}
118
+ <div class="dev-take section-reveal">
119
+ <div class="dev-take__label">Dev Take</div>
120
+ <p class="dev-take__text">"{{ session.devTake }}"</p>
121
+ </div>
122
+ {% endif %}
123
+
124
+ {%- comment -%} Main + Sidebar Layout {%- endcomment -%}
125
+ <div class="session-layout">
126
+ <div class="session-main">
127
+
128
+ {%- comment -%} Execution Path (Beats) {%- endcomment -%}
129
+ {% if session.beats.size > 0 %}
130
+ <section class="beats-section section-reveal" aria-label="Execution path">
131
+ <div class="section-label">
132
+ <span>&#167;02 &mdash; traverse log</span>
133
+ </div>
134
+ <h2 class="section-heading">Execution Path</h2>
135
+ <div class="beats-path" role="list">
136
+ {% for beat in session.beats %}
137
+ <div class="beat" role="listitem">
138
+ <div class="beat__marker"><div class="beat__marker-num">{{ beat.stepNumber }}</div></div>
139
+ <h3 class="beat__title">{{ beat.title }}</h3>
140
+ {% if beat.body != blank %}
141
+ <p class="beat__desc">{{ beat.body }}</p>
142
+ {% endif %}
143
+ </div>
144
+ {% endfor %}
145
+ </div>
146
+ </section>
147
+ {% endif %}
148
+
149
+ {%- comment -%} Context / Narrative {%- endcomment -%}
150
+ {% if session.narrative != blank %}
151
+ <section class="narrative section-reveal" aria-label="Session narrative">
152
+ <div class="section-label">
153
+ <span>&#167;03 &mdash; field notes</span>
154
+ </div>
155
+ <h2 class="section-heading">Narrative</h2>
156
+ <p>{{ session.narrative }}</p>
157
+ </section>
158
+ {% endif %}
159
+
160
+ {%- comment -%} Q&A {%- endcomment -%}
161
+ {% if session.qaPairs.size > 0 %}
162
+ <section class="qa-section section-reveal" aria-label="Questions and answers">
163
+ <div class="section-label">
164
+ <span>&#167;04 &mdash; triangulation</span>
165
+ </div>
166
+ <h2 class="section-heading">Q&amp;A</h2>
167
+ {% for qa in session.qaPairs %}
168
+ <div class="qa-item">
169
+ <div class="qa-item__q">
170
+ <span class="qa-item__q-mark">Q:</span>
171
+ <span>{{ qa.question }}</span>
172
+ </div>
173
+ <p class="qa-item__a">{{ qa.answer }}</p>
174
+ </div>
175
+ {% endfor %}
176
+ </section>
177
+ {% endif %}
178
+
179
+ {%- comment -%} Highlights {%- endcomment -%}
180
+ {% if session.highlights.size > 0 %}
181
+ <section class="narrative section-reveal" aria-label="Highlights">
182
+ <div class="section-label">
183
+ <span>&#167;05 &mdash; landmarks</span>
184
+ </div>
185
+ <h2 class="section-heading">Highlights</h2>
186
+ <ul style="list-style: none; padding: 0;">
187
+ {% for h in session.highlights %}
188
+ <li style="padding: 0.5rem 0; border-bottom: 1px solid var(--mer-border-subtle); font-size: 0.9375rem; color: var(--mer-text-secondary);">{{ h }}</li>
189
+ {% endfor %}
190
+ </ul>
191
+ </section>
192
+ {% endif %}
193
+
194
+ {%- comment -%} Agent Summary {%- endcomment -%}
195
+ {% if session.agentSummary %}
196
+ <section class="agents-section section-reveal" aria-label="Agent breakdown">
197
+ <div class="section-label">
198
+ <span>&#167;06 &mdash; crew manifest</span>
199
+ </div>
200
+ <h2 class="section-heading">Agent Summary</h2>
201
+ {% if session.agentSummary.agents.size > 0 %}
202
+ <table class="agent-table">
203
+ <thead>
204
+ <tr>
205
+ <th scope="col">Role</th>
206
+ <th scope="col">Duration</th>
207
+ <th scope="col">LOC</th>
208
+ </tr>
209
+ </thead>
210
+ <tbody>
211
+ {% for agent in session.agentSummary.agents %}
212
+ <tr>
213
+ <td>
214
+ <div class="agent-table__role">
215
+ <span class="agent-table__dot" style="background: var(--mer-accent)"></span>
216
+ {{ agent.role }}
217
+ </div>
218
+ </td>
219
+ <td class="mono-val">{% if agent.duration_minutes %}{{ agent.duration_minutes | formatDuration }}{% else %}&mdash;{% endif %}</td>
220
+ <td class="mono-val">{% if agent.loc_changed %}{{ agent.loc_changed | localeNumber }}{% else %}&mdash;{% endif %}</td>
221
+ </tr>
222
+ {% endfor %}
223
+ </tbody>
224
+ </table>
225
+ {% if session.agentSummary.agents.size > 0 %}
226
+ {% assign maxAgentDuration = 0 %}
227
+ {% for agent in session.agentSummary.agents %}
228
+ {% if agent.duration_minutes > maxAgentDuration %}{% assign maxAgentDuration = agent.duration_minutes %}{% endif %}
229
+ {% endfor %}
230
+ {% if maxAgentDuration == 0 %}{% assign maxAgentDuration = 1 %}{% endif %}
231
+ <div class="agent-bars" role="img" aria-label="Agent duration breakdown as horizontal bars">
232
+ {% for agent in session.agentSummary.agents %}
233
+ {% assign barPct = agent.duration_minutes | times: 100.0 | divided_by: maxAgentDuration | round %}
234
+ <div class="agent-bar-row">
235
+ <span class="agent-bar-row__label">{{ agent.role }}</span>
236
+ <div class="agent-bar-row__track">
237
+ <div class="agent-bar-row__fill" style="width: {{ barPct }}%; background: var(--mer-accent)"></div>
238
+ </div>
239
+ <span class="agent-bar-row__value">{% if agent.duration_minutes %}{{ agent.duration_minutes | formatDuration }}{% else %}&mdash;{% endif %}</span>
240
+ </div>
241
+ {% endfor %}
242
+ </div>
243
+ {% endif %}
244
+ {% endif %}
245
+ </section>
246
+ {% endif %}
247
+ </div>
248
+
249
+ {%- comment -%} Sidebar {%- endcomment -%}
250
+ <aside class="sidebar" aria-label="Session details">
251
+ {% if session.toolBreakdown.size > 0 %}
252
+ <div class="sidebar-block">
253
+ <h2 class="sidebar-block__title">Tools Used</h2>
254
+ <table class="tools-table">
255
+ <tbody>
256
+ {% for tool in session.toolBreakdown %}
257
+ <tr><td>{{ tool.tool }}</td><td>{{ tool.count }}</td></tr>
258
+ {% endfor %}
259
+ </tbody>
260
+ </table>
261
+ </div>
262
+ {% endif %}
263
+
264
+ {% if session.topFiles.size > 0 %}
265
+ <div class="sidebar-block">
266
+ <h2 class="sidebar-block__title">Files Changed</h2>
267
+ <ul class="files-list">
268
+ {% for file in session.topFiles %}
269
+ <li class="files-list__item">
270
+ <span class="files-list__path">{{ file.path }}</span>
271
+ <span class="files-list__diff">+{{ file.additions }}{% if file.deletions > 0 %} -{{ file.deletions }}{% endif %}</span>
272
+ </li>
273
+ {% endfor %}
274
+ </ul>
275
+ </div>
276
+ {% endif %}
277
+
278
+ {% if session.skills.size > 0 %}
279
+ <div class="sidebar-block">
280
+ <h2 class="sidebar-block__title">Skills</h2>
281
+ <div class="sidebar-skills">
282
+ {% for skill in session.skills %}
283
+ <span class="skill-chip">{{ skill }}</span>
284
+ {% endfor %}
285
+ </div>
286
+ </div>
287
+ {% endif %}
288
+ </aside>
289
+ </div>
290
+ </main>
291
+
292
+ <footer class="mer-footer">
293
+ <p class="mer-footer__text">surveyed with heyi.am &middot; meridian template</p>
294
+ </footer>
295
+ </div>
296
+
297
+
298
+ </div>