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,268 @@
1
+ // Transcript builder — transforms raw JSONL entries into structured
2
+ // messages for the session viewer UI. Pairs tool_use blocks with their
3
+ // tool_result responses, cleans internal XML, truncates large outputs.
4
+ import { cleanAssistantText } from './bridge.js';
5
+ import { stripHomePath, stripHomePathsInText } from './redact.js';
6
+ // ── Configuration ────────────────────────────────────────────
7
+ /** Max characters for tool output before truncation */
8
+ const MAX_OUTPUT_LENGTH = 3000;
9
+ /** Max characters for thinking blocks before truncation */
10
+ const MAX_THINKING_LENGTH = 5000;
11
+ // ── Helpers ─────────────────────────────────────────────────
12
+ function isToolUseBlock(block) {
13
+ return block.type === 'tool_use';
14
+ }
15
+ function isThinkingBlock(block) {
16
+ return block.type === 'thinking';
17
+ }
18
+ function isToolResultBlock(block) {
19
+ return block.type === 'tool_result';
20
+ }
21
+ function getContentBlocks(entry) {
22
+ const content = entry.message?.content;
23
+ if (!content || typeof content === 'string')
24
+ return [];
25
+ return content;
26
+ }
27
+ /** Extract the primary input string for a tool call (file path, command, pattern). */
28
+ function extractPrimaryInput(name, input) {
29
+ if (typeof input.file_path === 'string')
30
+ return input.file_path;
31
+ if (typeof input.command === 'string')
32
+ return input.command;
33
+ if (typeof input.pattern === 'string')
34
+ return input.pattern;
35
+ if (typeof input.path === 'string')
36
+ return input.path;
37
+ if (typeof input.prompt === 'string') {
38
+ const p = input.prompt;
39
+ return p.length > 120 ? p.slice(0, 117) + '...' : p;
40
+ }
41
+ // Fallback: summarize the keys
42
+ const keys = Object.keys(input).filter(k => input[k] !== undefined);
43
+ return keys.length > 0 ? `{${keys.join(', ')}}` : '';
44
+ }
45
+ /** Extract text content from a tool_result block's content field. */
46
+ function extractToolResultContent(content) {
47
+ if (typeof content === 'string')
48
+ return content;
49
+ if (content === null || content === undefined)
50
+ return '';
51
+ if (Array.isArray(content)) {
52
+ return content
53
+ .map((item) => {
54
+ if (typeof item === 'string')
55
+ return item;
56
+ if (item && typeof item === 'object' && 'text' in item)
57
+ return String(item.text);
58
+ return '';
59
+ })
60
+ .filter(Boolean)
61
+ .join('\n');
62
+ }
63
+ if (typeof content === 'object' && 'text' in content) {
64
+ return String(content.text);
65
+ }
66
+ return JSON.stringify(content);
67
+ }
68
+ /** Truncate text to max length with indicator. */
69
+ function truncateOutput(text, max) {
70
+ if (text.length <= max)
71
+ return { text, truncated: false };
72
+ return { text: text.slice(0, max), truncated: true };
73
+ }
74
+ /** Check if a user entry is purely tool-result plumbing (no actual user text). */
75
+ function isToolResultOnly(entry) {
76
+ const content = entry.message?.content;
77
+ if (typeof content === 'string')
78
+ return false;
79
+ if (!Array.isArray(content))
80
+ return false;
81
+ // If every block is a tool_result, it's plumbing
82
+ return content.length > 0 && content.every((block) => block.type === 'tool_result');
83
+ }
84
+ /** Should we skip this entry entirely? */
85
+ function shouldSkipEntry(entry) {
86
+ // Skip non-conversation entries
87
+ if (entry.type === 'system' || entry.type === 'progress')
88
+ return true;
89
+ if (entry.type === 'file-history-snapshot')
90
+ return true;
91
+ if (entry.type === 'agent-name')
92
+ return true;
93
+ if (entry.type === 'custom-title')
94
+ return true;
95
+ if (entry.type === 'last-prompt')
96
+ return true;
97
+ if (entry.type === 'queue-operation')
98
+ return true;
99
+ if (entry.isMeta)
100
+ return true;
101
+ // Skip sidechain entries (internal branching)
102
+ if (entry.isSidechain)
103
+ return true;
104
+ return false;
105
+ }
106
+ // ── Main builder ────────────────────────────────────────────
107
+ /**
108
+ * Build a structured transcript from raw JSONL entries.
109
+ *
110
+ * Two-pass algorithm:
111
+ * 1. Collect all tool_result blocks keyed by tool_use_id
112
+ * 2. Walk entries, build messages, pair tool calls with results
113
+ */
114
+ export function buildTranscript(entries, cwd) {
115
+ // Pass 1: collect tool results
116
+ const toolResults = new Map();
117
+ for (const entry of entries) {
118
+ if (entry.type !== 'user')
119
+ continue;
120
+ const blocks = getContentBlocks(entry);
121
+ for (const block of blocks) {
122
+ if (isToolResultBlock(block)) {
123
+ const content = extractToolResultContent(block.content);
124
+ toolResults.set(block.tool_use_id, {
125
+ content,
126
+ isError: !!block.is_error,
127
+ });
128
+ }
129
+ }
130
+ }
131
+ // Pass 2: build messages
132
+ const messages = [];
133
+ for (const entry of entries) {
134
+ if (shouldSkipEntry(entry))
135
+ continue;
136
+ if (entry.type === 'user') {
137
+ // Skip tool-result-only entries (plumbing between assistant turns)
138
+ if (isToolResultOnly(entry))
139
+ continue;
140
+ const content = entry.message?.content;
141
+ let userText = '';
142
+ if (typeof content === 'string') {
143
+ userText = cleanAssistantText(content);
144
+ }
145
+ else if (Array.isArray(content)) {
146
+ // Extract text blocks from user message (skip tool_result blocks)
147
+ const textParts = content
148
+ .filter((b) => b.type === 'text')
149
+ .map((b) => b.text)
150
+ .map(cleanAssistantText)
151
+ .filter(Boolean);
152
+ userText = textParts.join('\n');
153
+ }
154
+ if (!userText)
155
+ continue;
156
+ if (cwd)
157
+ userText = stripHomePathsInText(userText, cwd);
158
+ messages.push({
159
+ id: entry.uuid,
160
+ timestamp: entry.timestamp,
161
+ role: 'user',
162
+ blocks: [{ type: 'text', text: userText }],
163
+ });
164
+ }
165
+ else if (entry.type === 'assistant') {
166
+ const contentBlocks = getContentBlocks(entry);
167
+ const transcriptBlocks = [];
168
+ // Also handle string-only assistant content
169
+ if (typeof entry.message?.content === 'string') {
170
+ const cleaned = cleanAssistantText(entry.message.content);
171
+ if (cleaned) {
172
+ transcriptBlocks.push({
173
+ type: 'text',
174
+ text: cwd ? stripHomePathsInText(cleaned, cwd) : cleaned,
175
+ });
176
+ }
177
+ }
178
+ for (const block of contentBlocks) {
179
+ if (isThinkingBlock(block)) {
180
+ const thinking = block.thinking?.trim();
181
+ if (!thinking)
182
+ continue;
183
+ const { text, truncated } = truncateOutput(thinking, MAX_THINKING_LENGTH);
184
+ transcriptBlocks.push({
185
+ type: 'thinking',
186
+ text: truncated ? text + '\n\n[thinking truncated]' : text,
187
+ });
188
+ }
189
+ else if (block.type === 'text') {
190
+ const cleaned = cleanAssistantText(block.text);
191
+ if (!cleaned)
192
+ continue;
193
+ transcriptBlocks.push({
194
+ type: 'text',
195
+ text: cwd ? stripHomePathsInText(cleaned, cwd) : cleaned,
196
+ });
197
+ }
198
+ else if (isToolUseBlock(block)) {
199
+ let primaryInput = extractPrimaryInput(block.name, block.input);
200
+ if (primaryInput && cwd)
201
+ primaryInput = stripHomePath(primaryInput, cwd);
202
+ const result = toolResults.get(block.id);
203
+ let output;
204
+ let outputTruncated = false;
205
+ let isError = false;
206
+ if (result) {
207
+ let content = result.content;
208
+ if (cwd)
209
+ content = stripHomePathsInText(content, cwd);
210
+ const trunc = truncateOutput(content, MAX_OUTPUT_LENGTH);
211
+ output = trunc.text;
212
+ outputTruncated = trunc.truncated;
213
+ isError = result.isError;
214
+ }
215
+ // Sanitize inputData: strip full file contents from Write calls
216
+ const sanitizedInput = { ...block.input };
217
+ if (block.name === 'Write' && typeof sanitizedInput.content === 'string') {
218
+ const lines = sanitizedInput.content.split('\n').length;
219
+ sanitizedInput.content = `[${lines} lines]`;
220
+ }
221
+ transcriptBlocks.push({
222
+ type: 'tool_call',
223
+ toolCallId: block.id,
224
+ toolName: block.name,
225
+ input: primaryInput,
226
+ inputData: sanitizedInput,
227
+ output,
228
+ outputTruncated,
229
+ isError,
230
+ });
231
+ }
232
+ // Skip image blocks for now (could add later)
233
+ }
234
+ if (transcriptBlocks.length === 0)
235
+ continue;
236
+ messages.push({
237
+ id: entry.uuid,
238
+ timestamp: entry.timestamp,
239
+ role: 'assistant',
240
+ blocks: transcriptBlocks,
241
+ model: entry.message?.model,
242
+ });
243
+ }
244
+ }
245
+ return messages;
246
+ }
247
+ /**
248
+ * Build transcript with metadata for the API response.
249
+ */
250
+ export function buildTranscriptResponse(entries, opts = {}) {
251
+ const messages = buildTranscript(entries, opts.cwd);
252
+ return {
253
+ messages,
254
+ meta: {
255
+ totalMessages: messages.length,
256
+ totalTokens: {
257
+ input: opts.tokenUsage?.input_tokens ?? 0,
258
+ output: opts.tokenUsage?.output_tokens ?? 0,
259
+ },
260
+ models: opts.modelsUsed ?? [],
261
+ duration: {
262
+ activeMinutes: opts.activeMinutes ?? 0,
263
+ wallClockMinutes: opts.wallClockMinutes ?? 0,
264
+ },
265
+ },
266
+ };
267
+ }
268
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heyiam",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Turn AI coding sessions into portfolio case studies",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -48,6 +48,10 @@
48
48
  "@types/cors": "^2.8.19",
49
49
  "@types/express": "^5.0.6",
50
50
  "@types/node": "^22.0.0",
51
+ "@types/react": "^19.2.14",
52
+ "@types/react-dom": "^19.2.3",
53
+ "react": "^19.2.4",
54
+ "react-dom": "^19.2.4",
51
55
  "@types/supertest": "^7.2.0",
52
56
  "concurrently": "^9.2.1",
53
57
  "supertest": "^7.2.2",