context-lens 0.3.2 → 0.4.1

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 (126) hide show
  1. package/README.md +52 -16
  2. package/dist/analysis/ingest.d.ts +13 -0
  3. package/dist/analysis/ingest.d.ts.map +1 -0
  4. package/dist/analysis/ingest.js +75 -0
  5. package/dist/analysis/ingest.js.map +1 -0
  6. package/dist/analysis/server.d.ts +10 -0
  7. package/dist/analysis/server.d.ts.map +1 -0
  8. package/dist/analysis/server.js +95 -0
  9. package/dist/analysis/server.js.map +1 -0
  10. package/dist/analysis/watcher.d.ts +55 -0
  11. package/dist/analysis/watcher.d.ts.map +1 -0
  12. package/dist/analysis/watcher.js +170 -0
  13. package/dist/analysis/watcher.js.map +1 -0
  14. package/dist/cli-utils.d.ts +16 -0
  15. package/dist/cli-utils.d.ts.map +1 -1
  16. package/dist/cli-utils.js +185 -3
  17. package/dist/cli-utils.js.map +1 -1
  18. package/dist/cli.js +629 -88
  19. package/dist/cli.js.map +1 -1
  20. package/dist/core/conversation.d.ts +8 -1
  21. package/dist/core/conversation.d.ts.map +1 -1
  22. package/dist/core/conversation.js +38 -12
  23. package/dist/core/conversation.js.map +1 -1
  24. package/dist/core/parse.d.ts.map +1 -1
  25. package/dist/core/parse.js +17 -1
  26. package/dist/core/parse.js.map +1 -1
  27. package/dist/core/session-analysis.d.ts +100 -0
  28. package/dist/core/session-analysis.d.ts.map +1 -0
  29. package/dist/core/session-analysis.js +435 -0
  30. package/dist/core/session-analysis.js.map +1 -0
  31. package/dist/core/session-format.d.ts +20 -0
  32. package/dist/core/session-format.d.ts.map +1 -0
  33. package/dist/core/session-format.js +298 -0
  34. package/dist/core/session-format.js.map +1 -0
  35. package/dist/core.d.ts +4 -0
  36. package/dist/core.d.ts.map +1 -1
  37. package/dist/core.js +2 -0
  38. package/dist/core.js.map +1 -1
  39. package/dist/lhar/reader.d.ts +22 -0
  40. package/dist/lhar/reader.d.ts.map +1 -0
  41. package/dist/lhar/reader.js +43 -0
  42. package/dist/lhar/reader.js.map +1 -0
  43. package/dist/lhar/record.d.ts.map +1 -1
  44. package/dist/lhar/record.js +3 -0
  45. package/dist/lhar/record.js.map +1 -1
  46. package/dist/lhar/response.d.ts +8 -0
  47. package/dist/lhar/response.d.ts.map +1 -1
  48. package/dist/lhar/response.js +44 -0
  49. package/dist/lhar/response.js.map +1 -1
  50. package/dist/lhar/tools.d.ts +17 -0
  51. package/dist/lhar/tools.d.ts.map +1 -0
  52. package/dist/lhar/tools.js +48 -0
  53. package/dist/lhar/tools.js.map +1 -0
  54. package/dist/lhar-types.generated.d.ts +34 -0
  55. package/dist/lhar-types.generated.d.ts.map +1 -1
  56. package/dist/lhar.d.ts +4 -1
  57. package/dist/lhar.d.ts.map +1 -1
  58. package/dist/lhar.js +5 -1
  59. package/dist/lhar.js.map +1 -1
  60. package/dist/proxy/capture.d.ts +40 -0
  61. package/dist/proxy/capture.d.ts.map +1 -0
  62. package/dist/proxy/capture.js +56 -0
  63. package/dist/proxy/capture.js.map +1 -0
  64. package/dist/proxy/config.d.ts +16 -0
  65. package/dist/proxy/config.d.ts.map +1 -0
  66. package/dist/proxy/config.js +34 -0
  67. package/dist/proxy/config.js.map +1 -0
  68. package/dist/proxy/forward.d.ts +20 -0
  69. package/dist/proxy/forward.d.ts.map +1 -0
  70. package/dist/proxy/forward.js +210 -0
  71. package/dist/proxy/forward.js.map +1 -0
  72. package/dist/proxy/headers.d.ts +16 -0
  73. package/dist/proxy/headers.d.ts.map +1 -0
  74. package/dist/proxy/headers.js +37 -0
  75. package/dist/proxy/headers.js.map +1 -0
  76. package/dist/proxy/routing.d.ts +44 -0
  77. package/dist/proxy/routing.d.ts.map +1 -0
  78. package/dist/proxy/routing.js +114 -0
  79. package/dist/proxy/routing.js.map +1 -0
  80. package/dist/proxy/server.d.ts +27 -0
  81. package/dist/proxy/server.d.ts.map +1 -0
  82. package/dist/proxy/server.js +55 -0
  83. package/dist/proxy/server.js.map +1 -0
  84. package/dist/schemas.d.ts +328 -0
  85. package/dist/schemas.d.ts.map +1 -0
  86. package/dist/schemas.js +249 -0
  87. package/dist/schemas.js.map +1 -0
  88. package/dist/server/api.d.ts +3 -4
  89. package/dist/server/api.d.ts.map +1 -1
  90. package/dist/server/api.js +195 -220
  91. package/dist/server/api.js.map +1 -1
  92. package/dist/server/store.d.ts +23 -7
  93. package/dist/server/store.d.ts.map +1 -1
  94. package/dist/server/store.js +141 -50
  95. package/dist/server/store.js.map +1 -1
  96. package/dist/server/webui.d.ts +5 -2
  97. package/dist/server/webui.d.ts.map +1 -1
  98. package/dist/server/webui.js +32 -13
  99. package/dist/server/webui.js.map +1 -1
  100. package/dist/server-utils.d.ts +1 -2
  101. package/dist/server-utils.d.ts.map +1 -1
  102. package/dist/server-utils.js +0 -2
  103. package/dist/server-utils.js.map +1 -1
  104. package/dist/types.d.ts +1 -1
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/version.generated.d.ts +1 -1
  107. package/dist/version.generated.js +1 -1
  108. package/mitm_addon.py +99 -28
  109. package/package.json +12 -5
  110. package/schema/lhar.schema.json +50 -0
  111. package/dist/server/config.d.ts +0 -13
  112. package/dist/server/config.d.ts.map +0 -1
  113. package/dist/server/config.js +0 -36
  114. package/dist/server/config.js.map +0 -1
  115. package/dist/server/proxy.d.ts +0 -13
  116. package/dist/server/proxy.d.ts.map +0 -1
  117. package/dist/server/proxy.js +0 -218
  118. package/dist/server/proxy.js.map +0 -1
  119. package/dist/server/static.d.ts +0 -9
  120. package/dist/server/static.d.ts.map +0 -1
  121. package/dist/server/static.js +0 -78
  122. package/dist/server/static.js.map +0 -1
  123. package/dist/server.d.ts +0 -3
  124. package/dist/server.d.ts.map +0 -1
  125. package/dist/server.js +0 -43
  126. package/dist/server.js.map +0 -1
@@ -1,47 +1,34 @@
1
- import url from "node:url";
1
+ import { Hono } from "hono";
2
+ import { streamSSE } from "hono/streaming";
3
+ import * as v from "valibot";
4
+ import { ingestCapture } from "../analysis/ingest.js";
2
5
  import { parseContextInfo } from "../core.js";
3
6
  import { toLharJson, toLharJsonl } from "../lhar.js";
7
+ import { IngestCapturePayloadSchema, IngestLegacyPayloadSchema, } from "../schemas.js";
4
8
  import { projectEntry } from "./projection.js";
5
9
  function projectEntryForApi(e) {
6
10
  return projectEntry(e, e.contextInfo);
7
11
  }
8
- function getExportEntries(store, parsedUrl) {
9
- const convoFilter = parsedUrl.query.conversation;
10
- if (!convoFilter)
12
+ function getExportEntries(store, conversation) {
13
+ if (!conversation)
11
14
  return store.getCapturedRequests();
12
15
  return store
13
16
  .getCapturedRequests()
14
- .filter((e) => e.conversationId === convoFilter);
17
+ .filter((e) => e.conversationId === conversation);
15
18
  }
16
- function handleIngest(store, req, res) {
17
- if (req.method !== "POST") {
18
- res.writeHead(405);
19
- res.end();
20
- return;
21
- }
22
- const bodyChunks = [];
23
- req.on("data", (chunk) => {
24
- bodyChunks.push(chunk);
25
- });
26
- req.on("end", () => {
27
- try {
28
- const data = JSON.parse(Buffer.concat(bodyChunks).toString("utf8"));
29
- const provider = data.provider || "unknown";
30
- const apiFormat = data.apiFormat || "unknown";
31
- const source = data.source || "unknown";
32
- const contextInfo = parseContextInfo(provider, data.body || {}, apiFormat);
33
- store.storeRequest(contextInfo, data.response || {}, source, data.body || {});
34
- console.log(` 📥 Ingested: [${provider}] ${contextInfo.model} from ${source}`);
35
- res.writeHead(200, { "Content-Type": "application/json" });
36
- res.end(JSON.stringify({ ok: true }));
37
- }
38
- catch (e) {
39
- const message = e instanceof Error ? e.message : String(e);
40
- console.error("Ingest error:", message);
41
- res.writeHead(400, { "Content-Type": "application/json" });
42
- res.end(JSON.stringify({ error: message }));
43
- }
44
- });
19
+ function sanitizeFilenamePart(input, fallback) {
20
+ const sanitized = String(input || "")
21
+ .trim()
22
+ .replace(/[^a-zA-Z0-9._-]+/g, "_")
23
+ .replace(/^_+|_+$/g, "")
24
+ .slice(0, 80);
25
+ return sanitized || fallback;
26
+ }
27
+ function buildExportFilename(format, conversation, privacy) {
28
+ const sessionPart = `session-${sanitizeFilenamePart(conversation, "all")}`;
29
+ const privacyPart = `privacy-${sanitizeFilenamePart(privacy, "standard")}`;
30
+ const ext = format === "lhar" ? "lhar" : "lhar.json";
31
+ return `context-lens-export-${sessionPart}-${privacyPart}.${ext}`;
45
32
  }
46
33
  /**
47
34
  * Group captured requests into conversations with agents.
@@ -64,15 +51,18 @@ function buildConversationGroups(store) {
64
51
  return { grouped, ungrouped };
65
52
  }
66
53
  function buildFullConversation(id, entries, conversations) {
54
+ // Sort newest-first (by timestamp descending) for consistent API output.
55
+ // The UI and scrubber expect entries[0] to be the latest turn.
56
+ const sorted = [...entries].sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
67
57
  const meta = conversations.get(id) || {
68
58
  id,
69
59
  label: "Unknown",
70
60
  source: "unknown",
71
61
  workingDirectory: null,
72
- firstSeen: entries[entries.length - 1].timestamp,
62
+ firstSeen: sorted[sorted.length - 1].timestamp,
73
63
  };
74
64
  const agentMap = new Map();
75
- for (const e of entries) {
65
+ for (const e of sorted) {
76
66
  const ak = e.agentKey || "_default";
77
67
  if (!agentMap.has(ak))
78
68
  agentMap.set(ak, []);
@@ -92,201 +82,186 @@ function buildFullConversation(id, entries, conversations) {
92
82
  return {
93
83
  ...meta,
94
84
  agents,
95
- entries: entries.map(projectEntryForApi),
85
+ entries: sorted.map(projectEntryForApi),
96
86
  };
97
87
  }
98
- function handleRequests(store, _req, res, parsedUrl) {
99
- const isSummary = parsedUrl.query.summary === "true";
100
- const { grouped, ungrouped } = buildConversationGroups(store);
101
- const conversations = store.getConversations();
102
- if (isSummary) {
103
- // Lightweight: conversation metadata + summary stats, no entries
104
- const summaries = [];
105
- for (const [id, entries] of grouped) {
106
- const meta = conversations.get(id) || {
107
- id,
108
- label: "Unknown",
109
- source: "unknown",
110
- workingDirectory: null,
111
- firstSeen: entries[entries.length - 1].timestamp,
112
- };
113
- const latest = entries[0];
114
- const totalCost = entries.reduce((sum, e) => sum + (e.costUsd ?? 0), 0);
115
- // Token history for sparkline: main agent only, chronological (oldest → newest).
116
- // Main agent = most frequent agentKey in the conversation.
117
- const keyCounts = new Map();
118
- for (const e of entries) {
119
- const k = e.agentKey || "_default";
120
- keyCounts.set(k, (keyCounts.get(k) || 0) + 1);
121
- }
122
- let mainKey = "_default";
123
- let maxCount = 0;
124
- for (const [k, count] of keyCounts) {
125
- if (count > maxCount) {
126
- mainKey = k;
127
- maxCount = count;
128
- }
129
- }
130
- const tokenHistory = [];
131
- for (let i = entries.length - 1; i >= 0; i--) {
132
- const k = entries[i].agentKey || "_default";
133
- if (k === mainKey) {
134
- tokenHistory.push(entries[i].contextInfo.totalTokens);
135
- }
136
- }
137
- summaries.push({
138
- ...meta,
139
- entryCount: entries.length,
140
- latestTimestamp: latest.timestamp,
141
- latestModel: latest.contextInfo.model,
142
- latestTotalTokens: latest.contextInfo.totalTokens,
143
- contextLimit: latest.contextLimit,
144
- totalCost,
145
- healthScore: latest.healthScore,
146
- tokenHistory,
88
+ /**
89
+ * Create the Hono app with all API routes.
90
+ */
91
+ export function createApiApp(store) {
92
+ const app = new Hono();
93
+ // --- Ingest ---
94
+ app.post("/api/ingest", async (c) => {
95
+ const raw = await c.req.json();
96
+ // Try capture format first (from mitmproxy addon), then legacy format
97
+ const captureResult = v.safeParse(IngestCapturePayloadSchema, raw);
98
+ if (captureResult.success) {
99
+ const data = captureResult.output;
100
+ ingestCapture(store, {
101
+ ...data,
102
+ source: data.source ?? "unknown",
103
+ requestBody: data.requestBody ?? null,
147
104
  });
105
+ console.log(` 📥 Ingested (capture): [${data.provider}] from ${data.source ?? "unknown"}`);
106
+ return c.json({ ok: true });
148
107
  }
149
- summaries.sort((a, b) => new Date(b.latestTimestamp).getTime() -
150
- new Date(a.latestTimestamp).getTime());
151
- res.writeHead(200, { "Content-Type": "application/json" });
152
- res.end(JSON.stringify({
153
- revision: store.getRevision(),
154
- conversations: summaries,
155
- ungroupedCount: ungrouped.length,
156
- }));
157
- return;
158
- }
159
- // Full response (backwards compatible)
160
- const convos = [];
161
- for (const [id, entries] of grouped) {
162
- convos.push(buildFullConversation(id, entries, conversations));
163
- }
164
- convos.sort((a, b) => new Date(b.entries[0].timestamp).getTime() -
165
- new Date(a.entries[0].timestamp).getTime());
166
- res.writeHead(200, { "Content-Type": "application/json" });
167
- res.end(JSON.stringify({
168
- revision: store.getRevision(),
169
- conversations: convos,
170
- ungrouped: ungrouped.map(projectEntryForApi),
171
- }));
172
- }
173
- function handleConversationDetail(store, convoId, res) {
174
- const { grouped } = buildConversationGroups(store);
175
- const conversations = store.getConversations();
176
- const entries = grouped.get(convoId);
177
- if (!entries || entries.length === 0) {
178
- res.writeHead(404, { "Content-Type": "application/json" });
179
- res.end(JSON.stringify({ error: "Conversation not found" }));
180
- return;
181
- }
182
- const convo = buildFullConversation(convoId, entries, conversations);
183
- res.writeHead(200, { "Content-Type": "application/json" });
184
- res.end(JSON.stringify(convo));
185
- }
186
- function handleEvents(store, _req, res) {
187
- res.writeHead(200, {
188
- "Content-Type": "text/event-stream",
189
- "Cache-Control": "no-cache",
190
- Connection: "keep-alive",
191
- "Access-Control-Allow-Origin": "*",
108
+ const legacyResult = v.safeParse(IngestLegacyPayloadSchema, raw);
109
+ if (legacyResult.success) {
110
+ const data = legacyResult.output;
111
+ const contextInfo = parseContextInfo(data.provider, data.body, data.apiFormat);
112
+ store.storeRequest(contextInfo, data.response, data.source, data.body);
113
+ console.log(` 📥 Ingested: [${data.provider}] ${contextInfo.model} from ${data.source}`);
114
+ return c.json({ ok: true });
115
+ }
116
+ const message = v.summarize(legacyResult.issues);
117
+ console.error("Ingest validation error:", message);
118
+ return c.json({ error: message }, 400);
192
119
  });
193
- // Send initial revision so client knows current state
194
- const initial = JSON.stringify({
195
- revision: store.getRevision(),
196
- type: "connected",
120
+ // --- Entry detail ---
121
+ app.get("/api/entries/:id/detail", (c) => {
122
+ const entryId = parseInt(c.req.param("id"), 10);
123
+ const contextInfo = store.getEntryDetail(entryId);
124
+ if (contextInfo) {
125
+ return c.json({ contextInfo });
126
+ }
127
+ return c.json({ error: "Detail not found for this entry" }, 404);
197
128
  });
198
- res.write(`data: ${initial}\n\n`);
199
- const listener = (event) => {
200
- const data = JSON.stringify(event);
201
- res.write(`data: ${data}\n\n`);
202
- };
203
- store.on("change", listener);
204
- // Clean up when client disconnects
205
- _req.on("close", () => {
206
- store.off("change", listener);
129
+ // --- Conversations ---
130
+ app.delete("/api/conversations/:id", (c) => {
131
+ const convoId = decodeURIComponent(c.req.param("id"));
132
+ store.deleteConversation(convoId);
133
+ return c.json({ ok: true });
207
134
  });
208
- }
209
- function handleExportLhar(store, parsedUrl, _req, res) {
210
- const entries = getExportEntries(store, parsedUrl);
211
- const jsonl = toLharJsonl(entries, store.getConversations());
212
- res.writeHead(200, {
213
- "Content-Type": "application/x-ndjson",
214
- "Content-Disposition": 'attachment; filename="context-lens-export.lhar"',
135
+ app.get("/api/conversations/:id", (c) => {
136
+ const convoId = decodeURIComponent(c.req.param("id"));
137
+ const { grouped } = buildConversationGroups(store);
138
+ const conversations = store.getConversations();
139
+ const entries = grouped.get(convoId);
140
+ if (!entries || entries.length === 0) {
141
+ return c.json({ error: "Conversation not found" }, 404);
142
+ }
143
+ return c.json(buildFullConversation(convoId, entries, conversations));
215
144
  });
216
- res.end(jsonl);
217
- }
218
- function handleExportLharJson(store, parsedUrl, _req, res) {
219
- const entries = getExportEntries(store, parsedUrl);
220
- const wrapped = toLharJson(entries, store.getConversations());
221
- res.writeHead(200, {
222
- "Content-Type": "application/json",
223
- "Content-Disposition": 'attachment; filename="context-lens-export.lhar.json"',
145
+ // --- Reset ---
146
+ app.post("/api/reset", (c) => {
147
+ store.resetAll();
148
+ return c.json({ ok: true });
224
149
  });
225
- res.end(JSON.stringify(wrapped, null, 2));
226
- }
227
- /**
228
- * Create an API-only request handler. Returns true if the request was handled,
229
- * false if it should fall through to static file serving.
230
- */
231
- export function createApiHandler(store) {
232
- return function handleApi(req, res) {
233
- const parsedUrl = url.parse(req.url, true);
234
- const pathname = parsedUrl.pathname;
235
- if (pathname === "/api/ingest" && req.method === "POST") {
236
- handleIngest(store, req, res);
237
- return true;
238
- }
239
- // Entry detail: full uncompacted contextInfo for a specific entry
240
- const entryDetailMatch = pathname?.match(/^\/api\/entries\/(\d+)\/detail$/);
241
- if (entryDetailMatch && req.method === "GET") {
242
- const entryId = parseInt(entryDetailMatch[1], 10);
243
- const contextInfo = store.getEntryDetail(entryId);
244
- if (contextInfo) {
245
- res.writeHead(200, { "Content-Type": "application/json" });
246
- res.end(JSON.stringify({ contextInfo }));
247
- }
248
- else {
249
- res.writeHead(404, { "Content-Type": "application/json" });
250
- res.end(JSON.stringify({ error: "Detail not found for this entry" }));
150
+ // --- Requests (summary + full) ---
151
+ app.get("/api/requests", (c) => {
152
+ const isSummary = c.req.query("summary") === "true";
153
+ const { grouped, ungrouped } = buildConversationGroups(store);
154
+ const conversations = store.getConversations();
155
+ if (isSummary) {
156
+ const summaries = [];
157
+ for (const [id, rawEntries] of grouped) {
158
+ // Sort newest-first for consistent access patterns
159
+ const entries = [...rawEntries].sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
160
+ const meta = conversations.get(id) || {
161
+ id,
162
+ label: "Unknown",
163
+ source: "unknown",
164
+ workingDirectory: null,
165
+ firstSeen: entries[entries.length - 1].timestamp,
166
+ };
167
+ const latest = entries[0];
168
+ const totalCost = entries.reduce((sum, e) => sum + (e.costUsd ?? 0), 0);
169
+ const keyCounts = new Map();
170
+ for (const e of entries) {
171
+ const k = e.agentKey || "_default";
172
+ keyCounts.set(k, (keyCounts.get(k) || 0) + 1);
173
+ }
174
+ let mainKey = "_default";
175
+ let maxCount = 0;
176
+ for (const [k, count] of keyCounts) {
177
+ if (count > maxCount) {
178
+ mainKey = k;
179
+ maxCount = count;
180
+ }
181
+ }
182
+ const tokenHistory = [];
183
+ for (let i = entries.length - 1; i >= 0; i--) {
184
+ const k = entries[i].agentKey || "_default";
185
+ if (k === mainKey) {
186
+ tokenHistory.push(entries[i].contextInfo.totalTokens);
187
+ }
188
+ }
189
+ summaries.push({
190
+ ...meta,
191
+ entryCount: entries.length,
192
+ latestTimestamp: latest.timestamp,
193
+ latestModel: latest.contextInfo.model,
194
+ latestTotalTokens: latest.contextInfo.totalTokens,
195
+ contextLimit: latest.contextLimit,
196
+ totalCost,
197
+ healthScore: latest.healthScore,
198
+ tokenHistory,
199
+ });
251
200
  }
252
- return true;
253
- }
254
- const convoMatch = pathname?.match(/^\/api\/conversations\/(.+)$/);
255
- if (convoMatch && req.method === "DELETE") {
256
- const convoId = decodeURIComponent(convoMatch[1]);
257
- store.deleteConversation(convoId);
258
- res.writeHead(200, { "Content-Type": "application/json" });
259
- res.end(JSON.stringify({ ok: true }));
260
- return true;
261
- }
262
- if (convoMatch && req.method === "GET") {
263
- const convoId = decodeURIComponent(convoMatch[1]);
264
- handleConversationDetail(store, convoId, res);
265
- return true;
266
- }
267
- if (pathname === "/api/reset" && req.method === "POST") {
268
- store.resetAll();
269
- res.writeHead(200, { "Content-Type": "application/json" });
270
- res.end(JSON.stringify({ ok: true }));
271
- return true;
272
- }
273
- if (pathname === "/api/requests") {
274
- handleRequests(store, req, res, parsedUrl);
275
- return true;
276
- }
277
- if (pathname === "/api/events") {
278
- handleEvents(store, req, res);
279
- return true;
280
- }
281
- if (pathname === "/api/export/lhar") {
282
- handleExportLhar(store, parsedUrl, req, res);
283
- return true;
201
+ summaries.sort((a, b) => new Date(b.latestTimestamp).getTime() -
202
+ new Date(a.latestTimestamp).getTime());
203
+ return c.json({
204
+ revision: store.getRevision(),
205
+ conversations: summaries,
206
+ ungroupedCount: ungrouped.length,
207
+ });
284
208
  }
285
- if (pathname === "/api/export/lhar.json") {
286
- handleExportLharJson(store, parsedUrl, req, res);
287
- return true;
209
+ // Full response
210
+ const convos = [];
211
+ for (const [id, entries] of grouped) {
212
+ convos.push(buildFullConversation(id, entries, conversations));
288
213
  }
289
- return false;
290
- };
214
+ convos.sort((a, b) => new Date(b.entries[0].timestamp).getTime() -
215
+ new Date(a.entries[0].timestamp).getTime());
216
+ return c.json({
217
+ revision: store.getRevision(),
218
+ conversations: convos,
219
+ ungrouped: ungrouped.map(projectEntryForApi),
220
+ });
221
+ });
222
+ // --- SSE events ---
223
+ app.get("/api/events", (c) => {
224
+ return streamSSE(c, async (stream) => {
225
+ const initial = JSON.stringify({
226
+ revision: store.getRevision(),
227
+ type: "connected",
228
+ });
229
+ await stream.writeSSE({ data: initial });
230
+ const listener = (event) => {
231
+ const data = JSON.stringify(event);
232
+ stream.writeSSE({ data }).catch(() => {
233
+ // Client disconnected
234
+ });
235
+ };
236
+ store.on("change", listener);
237
+ stream.onAbort(() => {
238
+ store.off("change", listener);
239
+ });
240
+ // Keep the stream open until the client disconnects
241
+ await new Promise(() => { });
242
+ });
243
+ });
244
+ // --- Export ---
245
+ app.get("/api/export/lhar", (c) => {
246
+ const conversation = c.req.query("conversation");
247
+ const privacy = (c.req.query("privacy") || "standard");
248
+ const entries = getExportEntries(store, conversation);
249
+ const jsonl = toLharJsonl(entries, store.getConversations(), privacy);
250
+ const filename = buildExportFilename("lhar", conversation, privacy);
251
+ c.header("Content-Disposition", `attachment; filename="${filename}"`);
252
+ return c.text(jsonl, 200, {
253
+ "Content-Type": "application/x-ndjson",
254
+ });
255
+ });
256
+ app.get("/api/export/lhar.json", (c) => {
257
+ const conversation = c.req.query("conversation");
258
+ const privacy = (c.req.query("privacy") || "standard");
259
+ const entries = getExportEntries(store, conversation);
260
+ const wrapped = toLharJson(entries, store.getConversations(), privacy);
261
+ const filename = buildExportFilename("lhar.json", conversation, privacy);
262
+ c.header("Content-Disposition", `attachment; filename="${filename}"`);
263
+ return c.json(wrapped);
264
+ });
265
+ return app;
291
266
  }
292
267
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,6 @@ export declare class Store {
18
18
  private diskSessionsWritten;
19
19
  private dataRevision;
20
20
  private nextEntryId;
21
- private stateVersion;
22
21
  private changeListeners;
23
22
  constructor(opts: {
24
23
  dataDir: string;
@@ -40,12 +39,6 @@ export declare class Store {
40
39
  resetAll(): void;
41
40
  /** Backfill health scores for entries loaded from state that don't have one. */
42
41
  private backfillHealthScores;
43
- /**
44
- * Recalculate token counts for messages that contain image blocks.
45
- *
46
- * Before the image token fix, estimateTokens() would stringify base64 image
47
- * data, producing millions of phantom tokens. Persisted entries still have
48
- * those inflated counts. This migration recalculates from the compacted
49
42
  /**
50
43
  * Backfill totalTokens from API usage data for entries that only have estimates.
51
44
  * The estimate (chars/4) can be wildly inaccurate; the API's real token count
@@ -58,6 +51,7 @@ export declare class Store {
58
51
  * the full uncompacted contextInfo) as the source of truth.
59
52
  */
60
53
  private restoreTokenCountsFromDetails;
54
+ private writeMarker;
61
55
  /**
62
56
  * Migrate image token counts: re-estimate token counts for messages containing
63
57
  * contentBlocks (which have no base64 data) using the fixed estimateTokens().
@@ -79,9 +73,31 @@ export declare class Store {
79
73
  private removeConversationDetails;
80
74
  private logToDisk;
81
75
  private compactBlock;
76
+ /**
77
+ * Compact tool_use input: preserve keys that contain file paths (small strings),
78
+ * drop large values like file content, diffs, and command output.
79
+ */
80
+ private compactToolInput;
82
81
  private compactMessages;
83
82
  private compactContextInfo;
84
83
  private compactEntry;
84
+ /**
85
+ * Append a single new entry (and its conversation) to the state file.
86
+ * This is O(entry size) instead of O(total state size).
87
+ *
88
+ * The conversation line is always written so that backfilled fields
89
+ * (source, workingDirectory) are captured. On loadState, later
90
+ * conversation lines overwrite earlier ones, so duplicates are harmless.
91
+ */
92
+ private appendToState;
93
+ /**
94
+ * Full rewrite of the state file. Used after structural changes
95
+ * (eviction, deletion, reset, migrations) where append is not sufficient.
96
+ *
97
+ * Entries are written oldest-first (chronological) to match the append-only
98
+ * convention used by appendToState(). loadState() reverses on read to
99
+ * restore the in-memory newest-first order.
100
+ */
85
101
  private saveState;
86
102
  }
87
103
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/server/store.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAM7D,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IAGzB,OAAO,CAAC,eAAe,CAAkC;gBAE7C,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;KACxB;IAoBD,WAAW,IAAI,MAAM;IAIrB,UAAU,IAAI,YAAY;IAM1B,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAIzD,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAI1D,OAAO,CAAC,UAAU;IAelB,mBAAmB,IAAI,aAAa,EAAE;IAItC,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI7C,SAAS,IAAI,IAAI;IAoEjB,YAAY,CACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,IAAI,CAAC,EAAE,WAAW,EAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,aAAa;IAiNhB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBzC,QAAQ,IAAI,IAAI;IA2BhB,gFAAgF;IAChF,OAAO,CAAC,oBAAoB;IA4C5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,4BAA4B;IAgBpC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAuCrC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUnD;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,SAAS;IA4CjB,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,SAAS;CAoBlB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/server/store.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAE7D,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IAGxB,OAAO,CAAC,eAAe,CAAkC;gBAE7C,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;KACxB;IAoBD,WAAW,IAAI,MAAM;IAIrB,UAAU,IAAI,YAAY;IAM1B,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAIzD,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAI1D,OAAO,CAAC,UAAU;IAelB,mBAAmB,IAAI,aAAa,EAAE;IAItC,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI7C,SAAS,IAAI,IAAI;IAuFjB,YAAY,CACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,IAAI,CAAC,EAAE,WAAW,EAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,aAAa;IAgNhB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBzC,QAAQ,IAAI,IAAI;IA2BhB,gFAAgF;IAChF,OAAO,CAAC,oBAAoB;IA4C5B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAgBpC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAiDrC,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUnD;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,SAAS;IA4CjB,OAAO,CAAC,YAAY;IAyCpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,YAAY;IA0BpB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;CAsBlB"}