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.
- package/dist/analyzer.d.ts +3 -3
- package/dist/archive.d.ts +14 -0
- package/dist/archive.js +125 -0
- package/dist/archive.js.map +1 -0
- package/dist/auth.d.ts +0 -6
- package/dist/auth.js +2 -4
- package/dist/auth.js.map +1 -1
- package/dist/autostart.d.ts +19 -0
- package/dist/autostart.js +103 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bridge.d.ts +0 -2
- package/dist/bridge.js +33 -4
- package/dist/bridge.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/context-export.d.ts +22 -0
- package/dist/context-export.js +230 -0
- package/dist/context-export.js.map +1 -0
- package/dist/daemon-install.d.ts +23 -0
- package/dist/daemon-install.js +155 -0
- package/dist/daemon-install.js.map +1 -0
- package/dist/db.d.ts +118 -0
- package/dist/db.js +444 -0
- package/dist/db.js.map +1 -0
- package/dist/export.d.ts +30 -0
- package/dist/export.js +377 -0
- package/dist/export.js.map +1 -0
- package/dist/format-utils.d.ts +6 -0
- package/dist/format-utils.js +15 -0
- package/dist/format-utils.js.map +1 -0
- package/dist/index.js +474 -117
- package/dist/index.js.map +1 -1
- package/dist/llm/project-enhance.js +1 -1
- package/dist/parsers/claude.js +73 -0
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.js +1 -1
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/cursor.d.ts +2 -0
- package/dist/parsers/cursor.js +14 -26
- package/dist/parsers/cursor.js.map +1 -1
- package/dist/parsers/gemini.d.ts +3 -2
- package/dist/parsers/gemini.js +198 -21
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/index.d.ts +1 -1
- package/dist/parsers/index.js +23 -7
- package/dist/parsers/index.js.map +1 -1
- package/dist/parsers/types.d.ts +27 -1
- package/dist/render/build-render-data.d.ts +59 -0
- package/dist/render/build-render-data.js +101 -0
- package/dist/render/build-render-data.js.map +1 -0
- package/dist/render/components/PortfolioPage.d.ts +4 -0
- package/dist/render/components/PortfolioPage.js +16 -0
- package/dist/render/components/PortfolioPage.js.map +1 -0
- package/dist/render/components/ProjectPage.d.ts +4 -0
- package/dist/render/components/ProjectPage.js +101 -0
- package/dist/render/components/ProjectPage.js.map +1 -0
- package/dist/render/components/SessionPage.d.ts +4 -0
- package/dist/render/components/SessionPage.js +29 -0
- package/dist/render/components/SessionPage.js.map +1 -0
- package/dist/render/index.d.ts +37 -0
- package/dist/render/index.js +140 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/types.d.ts +121 -0
- package/dist/render/types.js +9 -0
- package/dist/render/types.js.map +1 -0
- package/dist/routes/archive.d.ts +3 -0
- package/dist/routes/archive.js +56 -0
- package/dist/routes/archive.js.map +1 -0
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.js +116 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/context.d.ts +61 -0
- package/dist/routes/context.js +356 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.js +103 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/enhance.d.ts +3 -0
- package/dist/routes/enhance.js +305 -0
- package/dist/routes/enhance.js.map +1 -0
- package/dist/routes/export.d.ts +3 -0
- package/dist/routes/export.js +145 -0
- package/dist/routes/export.js.map +1 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +13 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/preview.d.ts +3 -0
- package/dist/routes/preview.js +191 -0
- package/dist/routes/preview.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.js +356 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/publish.d.ts +3 -0
- package/dist/routes/publish.js +466 -0
- package/dist/routes/publish.js.map +1 -0
- package/dist/routes/search.d.ts +3 -0
- package/dist/routes/search.js +110 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/sessions.d.ts +3 -0
- package/dist/routes/sessions.js +103 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/settings.d.ts +3 -0
- package/dist/routes/settings.js +30 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/screenshot.d.ts +5 -2
- package/dist/screenshot.js +187 -13
- package/dist/screenshot.js.map +1 -1
- package/dist/search.d.ts +30 -0
- package/dist/search.js +153 -0
- package/dist/search.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +55 -1318
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +23 -6
- package/dist/settings.js +36 -12
- package/dist/settings.js.map +1 -1
- package/dist/source-audit.d.ts +29 -0
- package/dist/source-audit.js +203 -0
- package/dist/source-audit.js.map +1 -0
- package/dist/sync.d.ts +74 -0
- package/dist/sync.js +358 -0
- package/dist/sync.js.map +1 -0
- package/dist/transcript.d.ts +68 -0
- package/dist/transcript.js +268 -0
- package/dist/transcript.js.map +1 -0
- package/package.json +5 -1
- package/app/dist/assets/html2canvas-Cwn_rrOw.js +0 -5
- package/app/dist/assets/index-CEQyTkgN.js +0 -14
- package/app/dist/assets/index-DLh5xRE8.css +0 -1
- package/app/dist/favicon.svg +0 -5
- package/app/dist/icons.svg +0 -24
- package/app/dist/index.html +0 -20
- package/dist/machine-key.d.ts +0 -10
- package/dist/machine-key.js +0 -51
- package/dist/machine-key.js.map +0 -1
package/dist/sync.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
// Sync — shared session indexing pipeline for both server and CLI
|
|
2
|
+
//
|
|
3
|
+
// The core loop: discover sessions → check staleness → parse/bridge/analyze → index into SQLite.
|
|
4
|
+
// Called by server.ts on startup and by CLI commands (search, context, reindex) standalone.
|
|
5
|
+
import { statSync, watch } from 'node:fs';
|
|
6
|
+
import { join, basename, dirname } from 'node:path';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { listSessions, parseSession, encodeDirPath } from './parsers/index.js';
|
|
9
|
+
import { discoverCursorWorkspaces, listConversations } from './parsers/cursor.js';
|
|
10
|
+
import { bridgeToAnalyzer } from './bridge.js';
|
|
11
|
+
import { analyzeSession } from './analyzer.js';
|
|
12
|
+
import { isSessionStale, indexSession, rebuildIndex, optimizeFtsIndex, } from './db.js';
|
|
13
|
+
import { renderCompact } from './context-export.js';
|
|
14
|
+
import { getArchiveDir } from './settings.js';
|
|
15
|
+
let _syncState = {
|
|
16
|
+
status: 'idle',
|
|
17
|
+
phase: 'done',
|
|
18
|
+
current: 0,
|
|
19
|
+
total: 0,
|
|
20
|
+
result: null,
|
|
21
|
+
startedAt: null,
|
|
22
|
+
finishedAt: null,
|
|
23
|
+
};
|
|
24
|
+
const _syncListeners = new Set();
|
|
25
|
+
export function getSyncState() {
|
|
26
|
+
return { ..._syncState };
|
|
27
|
+
}
|
|
28
|
+
export function onSyncProgress(listener) {
|
|
29
|
+
_syncListeners.add(listener);
|
|
30
|
+
return () => { _syncListeners.delete(listener); };
|
|
31
|
+
}
|
|
32
|
+
function notifyListeners() {
|
|
33
|
+
const snapshot = { ..._syncState };
|
|
34
|
+
for (const fn of _syncListeners)
|
|
35
|
+
fn(snapshot);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Wrapper around syncSessionIndex that tracks state for the dashboard.
|
|
39
|
+
* Use this in server.ts instead of calling syncSessionIndex directly.
|
|
40
|
+
*/
|
|
41
|
+
export async function syncWithTracking(db, basePath) {
|
|
42
|
+
_syncState = {
|
|
43
|
+
status: 'syncing',
|
|
44
|
+
phase: 'discovering',
|
|
45
|
+
current: 0,
|
|
46
|
+
total: 0,
|
|
47
|
+
result: null,
|
|
48
|
+
startedAt: Date.now(),
|
|
49
|
+
finishedAt: null,
|
|
50
|
+
};
|
|
51
|
+
notifyListeners();
|
|
52
|
+
const result = await syncSessionIndex(db, basePath, (progress) => {
|
|
53
|
+
_syncState = {
|
|
54
|
+
..._syncState,
|
|
55
|
+
phase: progress.phase,
|
|
56
|
+
current: progress.current ?? _syncState.current,
|
|
57
|
+
total: progress.total ?? _syncState.total,
|
|
58
|
+
currentProject: progress.currentProject ?? _syncState.currentProject,
|
|
59
|
+
};
|
|
60
|
+
notifyListeners();
|
|
61
|
+
});
|
|
62
|
+
_syncState = {
|
|
63
|
+
..._syncState,
|
|
64
|
+
status: 'done',
|
|
65
|
+
phase: 'done',
|
|
66
|
+
result,
|
|
67
|
+
finishedAt: Date.now(),
|
|
68
|
+
};
|
|
69
|
+
notifyListeners();
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
// ── Helpers ──────────────────────────────────────────────────
|
|
73
|
+
/** Derive a human-readable project name from the encoded directory name. */
|
|
74
|
+
export function displayNameFromDir(dirName) {
|
|
75
|
+
const devIdx = dirName.indexOf('-Dev-');
|
|
76
|
+
if (devIdx !== -1)
|
|
77
|
+
return dirName.slice(devIdx + 5);
|
|
78
|
+
const segments = dirName.split('-').filter(Boolean);
|
|
79
|
+
return segments.length > 0 ? segments[segments.length - 1] : dirName;
|
|
80
|
+
}
|
|
81
|
+
/** Get file mtime and size, or zeros on error. */
|
|
82
|
+
function getFileStats(filePath) {
|
|
83
|
+
try {
|
|
84
|
+
const stat = statSync(filePath);
|
|
85
|
+
return { mtime: stat.mtimeMs, size: stat.size };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { mtime: 0, size: 0 };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// ── Index a Single Session ───────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Index a single session if stale or missing from the DB.
|
|
94
|
+
* Returns true if the session was (re-)indexed, false if skipped.
|
|
95
|
+
*/
|
|
96
|
+
export async function ensureSessionIndexed(db, meta, projectName) {
|
|
97
|
+
if (!isSessionStale(db, meta.sessionId, meta.path))
|
|
98
|
+
return false;
|
|
99
|
+
const parsed = await parseSession(meta.path);
|
|
100
|
+
const input = bridgeToAnalyzer(parsed, { sessionId: meta.sessionId, projectName });
|
|
101
|
+
const session = analyzeSession(input);
|
|
102
|
+
const { mtime, size } = getFileStats(meta.path);
|
|
103
|
+
// Pre-compute compact context summary for offline access after source deletion
|
|
104
|
+
const contextSummary = renderCompact(session);
|
|
105
|
+
const upsertInput = {
|
|
106
|
+
meta,
|
|
107
|
+
analysis: parsed,
|
|
108
|
+
session,
|
|
109
|
+
fileMtime: mtime,
|
|
110
|
+
fileSize: size,
|
|
111
|
+
contextSummary,
|
|
112
|
+
};
|
|
113
|
+
indexSession(db, upsertInput, input.turns);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// ── Full Sync ────────────────────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Discover all sessions and index any that are stale or missing.
|
|
119
|
+
*
|
|
120
|
+
* This is the main sync entry point — called by:
|
|
121
|
+
* - `createApp()` in server.ts (on startup, with the server's DB)
|
|
122
|
+
* - CLI commands in index.ts (search, context, reindex — standalone)
|
|
123
|
+
*
|
|
124
|
+
* @param db Open SQLite database
|
|
125
|
+
* @param basePath Optional base path override (for tests)
|
|
126
|
+
* @param onProgress Optional callback for progress reporting
|
|
127
|
+
*/
|
|
128
|
+
export async function syncSessionIndex(db, basePath, onProgress) {
|
|
129
|
+
const result = {
|
|
130
|
+
discovered: 0,
|
|
131
|
+
indexed: 0,
|
|
132
|
+
skipped: 0,
|
|
133
|
+
errors: 0,
|
|
134
|
+
};
|
|
135
|
+
// Phase 1: Discover sessions (parents only from listSessions)
|
|
136
|
+
onProgress?.({ phase: 'discovering' });
|
|
137
|
+
const parentSessions = await listSessions(basePath);
|
|
138
|
+
// Flatten: include children (subagents) so they get indexed into the DB too.
|
|
139
|
+
// Without this, the detail endpoint can't build childMap from DB rows.
|
|
140
|
+
const allSessions = [];
|
|
141
|
+
for (const parent of parentSessions) {
|
|
142
|
+
allSessions.push(parent);
|
|
143
|
+
if (parent.children?.length) {
|
|
144
|
+
allSessions.push(...parent.children);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
result.discovered = allSessions.length;
|
|
148
|
+
// Phase 2: Index stale/missing sessions
|
|
149
|
+
onProgress?.({ phase: 'indexing', current: 0, total: allSessions.length });
|
|
150
|
+
for (let i = 0; i < allSessions.length; i++) {
|
|
151
|
+
const meta = allSessions[i];
|
|
152
|
+
const projectName = displayNameFromDir(meta.projectDir);
|
|
153
|
+
try {
|
|
154
|
+
const wasIndexed = await ensureSessionIndexed(db, meta, projectName);
|
|
155
|
+
if (wasIndexed) {
|
|
156
|
+
result.indexed++;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
result.skipped++;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
result.errors++;
|
|
164
|
+
}
|
|
165
|
+
onProgress?.({
|
|
166
|
+
phase: 'indexing',
|
|
167
|
+
current: i + 1,
|
|
168
|
+
total: allSessions.length,
|
|
169
|
+
sessionId: meta.sessionId,
|
|
170
|
+
currentProject: projectName,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// Sessions whose source files are gone stay in the DB — that's the archive.
|
|
174
|
+
// We never auto-delete. Only explicit user action removes sessions.
|
|
175
|
+
onProgress?.({ phase: 'done' });
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
// ── Quick Sync (for CLI) ─────────────────────────────────────
|
|
179
|
+
// ── Full Rebuild ─────────────────────────────────────────────
|
|
180
|
+
/**
|
|
181
|
+
* Drop all indexed data and rebuild from scratch.
|
|
182
|
+
* Used by `heyiam reindex` CLI command.
|
|
183
|
+
*/
|
|
184
|
+
export async function fullReindex(db, basePath, onProgress) {
|
|
185
|
+
rebuildIndex(db);
|
|
186
|
+
const result = await syncSessionIndex(db, basePath, onProgress);
|
|
187
|
+
// F17: Optimize FTS5 segments after bulk rebuild
|
|
188
|
+
optimizeFtsIndex(db);
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
// ── File Watcher ─────────────────────────────────────────────
|
|
192
|
+
/** Debounce timers keyed by file path */
|
|
193
|
+
const debounceTimers = new Map();
|
|
194
|
+
const DEBOUNCE_MS = 5_000;
|
|
195
|
+
/**
|
|
196
|
+
* Try to index a single changed JSONL file.
|
|
197
|
+
* Derives sessionId and projectDir from the file path structure.
|
|
198
|
+
*
|
|
199
|
+
* Claude Code file layout:
|
|
200
|
+
* .claude/projects/{projectDir}/{sessionId}.jsonl — parent session
|
|
201
|
+
* .claude/projects/{projectDir}/{sessionId}/subagents/... — subagent sessions
|
|
202
|
+
*/
|
|
203
|
+
async function handleFileChange(db, filePath) {
|
|
204
|
+
if (!filePath.endsWith('.jsonl'))
|
|
205
|
+
return;
|
|
206
|
+
const sessionId = basename(filePath, '.jsonl');
|
|
207
|
+
const parentDirName = basename(dirname(filePath));
|
|
208
|
+
// Detect subagent: path contains /subagents/ directory
|
|
209
|
+
const isSubagent = parentDirName === 'subagents';
|
|
210
|
+
let projectDir;
|
|
211
|
+
let parentSessionId;
|
|
212
|
+
if (isSubagent) {
|
|
213
|
+
// .../projects/{projectDir}/{parentSessionId}/subagents/{agentId}.jsonl
|
|
214
|
+
const sessionDataDir = dirname(dirname(filePath)); // up past subagents/
|
|
215
|
+
parentSessionId = basename(sessionDataDir);
|
|
216
|
+
projectDir = basename(dirname(sessionDataDir));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// .../projects/{projectDir}/{sessionId}.jsonl
|
|
220
|
+
projectDir = parentDirName;
|
|
221
|
+
}
|
|
222
|
+
const projectName = displayNameFromDir(projectDir);
|
|
223
|
+
const meta = {
|
|
224
|
+
path: filePath,
|
|
225
|
+
source: 'claude',
|
|
226
|
+
sessionId,
|
|
227
|
+
projectDir,
|
|
228
|
+
isSubagent,
|
|
229
|
+
...(parentSessionId ? { parentSessionId } : {}),
|
|
230
|
+
};
|
|
231
|
+
try {
|
|
232
|
+
await ensureSessionIndexed(db, meta, projectName);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Parse/index failed — will be caught on next full sync
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Start file watchers on known session source directories.
|
|
240
|
+
* Watches for changes to JSONL files and re-indexes them with a 5s debounce.
|
|
241
|
+
*
|
|
242
|
+
* Returns a cleanup function that stops all watchers.
|
|
243
|
+
*/
|
|
244
|
+
export function startFileWatcher(db) {
|
|
245
|
+
const watchers = [];
|
|
246
|
+
const dirs = [
|
|
247
|
+
// Claude Code live sessions
|
|
248
|
+
join(homedir(), '.claude', 'projects'),
|
|
249
|
+
// Claude Code archive
|
|
250
|
+
getArchiveDir(),
|
|
251
|
+
// Codex sessions
|
|
252
|
+
join(homedir(), '.codex', 'sessions'),
|
|
253
|
+
// Gemini sessions
|
|
254
|
+
join(homedir(), '.gemini', 'tmp'),
|
|
255
|
+
];
|
|
256
|
+
for (const dir of dirs) {
|
|
257
|
+
try {
|
|
258
|
+
const watcher = watch(dir, { recursive: true }, (_event, filename) => {
|
|
259
|
+
if (!filename || !filename.endsWith('.jsonl'))
|
|
260
|
+
return;
|
|
261
|
+
const fullPath = join(dir, filename);
|
|
262
|
+
// Debounce: wait 5s after last change before re-indexing
|
|
263
|
+
const existing = debounceTimers.get(fullPath);
|
|
264
|
+
if (existing)
|
|
265
|
+
clearTimeout(existing);
|
|
266
|
+
debounceTimers.set(fullPath, setTimeout(() => {
|
|
267
|
+
debounceTimers.delete(fullPath);
|
|
268
|
+
handleFileChange(db, fullPath).catch(() => { });
|
|
269
|
+
}, DEBOUNCE_MS));
|
|
270
|
+
});
|
|
271
|
+
watchers.push(watcher);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Directory doesn't exist — skip silently
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return () => {
|
|
278
|
+
for (const w of watchers)
|
|
279
|
+
w.close();
|
|
280
|
+
for (const timer of debounceTimers.values())
|
|
281
|
+
clearTimeout(timer);
|
|
282
|
+
debounceTimers.clear();
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
// ── Cursor Polling ───────────────────────────────────────────
|
|
286
|
+
/**
|
|
287
|
+
* Poll Cursor workspace DBs for new or updated conversations.
|
|
288
|
+
* Cursor stores conversations in SQLite, so we can't use fs.watch.
|
|
289
|
+
* Instead we poll at an interval and compare lastUpdatedAt values.
|
|
290
|
+
*
|
|
291
|
+
* Returns a cleanup function that stops polling.
|
|
292
|
+
*/
|
|
293
|
+
export function startCursorPolling(db, intervalMs = 30_000) {
|
|
294
|
+
// Track last-seen lastUpdatedAt per composerId
|
|
295
|
+
const lastSeen = new Map();
|
|
296
|
+
async function poll() {
|
|
297
|
+
let workspaces;
|
|
298
|
+
try {
|
|
299
|
+
workspaces = await discoverCursorWorkspaces();
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const CURSOR_DATA_CUTOFF = new Date('2025-09-01').getTime();
|
|
305
|
+
for (const ws of workspaces) {
|
|
306
|
+
const conversations = listConversations(ws);
|
|
307
|
+
for (const conv of conversations) {
|
|
308
|
+
if (!conv.name)
|
|
309
|
+
continue;
|
|
310
|
+
if (conv.createdAt < CURSOR_DATA_CUTOFF)
|
|
311
|
+
continue;
|
|
312
|
+
const prevUpdated = lastSeen.get(conv.composerId);
|
|
313
|
+
const currentUpdated = conv.lastUpdatedAt ?? conv.createdAt;
|
|
314
|
+
// Skip if we've seen this exact state before
|
|
315
|
+
if (prevUpdated !== undefined && prevUpdated >= currentUpdated)
|
|
316
|
+
continue;
|
|
317
|
+
lastSeen.set(conv.composerId, currentUpdated);
|
|
318
|
+
// Build the cursor:// URL the same way listSessions does
|
|
319
|
+
const params = new URLSearchParams();
|
|
320
|
+
if (conv.name)
|
|
321
|
+
params.set('name', conv.name);
|
|
322
|
+
if (conv.createdAt)
|
|
323
|
+
params.set('createdAt', String(conv.createdAt));
|
|
324
|
+
if (conv.lastUpdatedAt)
|
|
325
|
+
params.set('lastUpdatedAt', String(conv.lastUpdatedAt));
|
|
326
|
+
if (conv.totalLinesAdded)
|
|
327
|
+
params.set('linesAdded', String(conv.totalLinesAdded));
|
|
328
|
+
if (conv.totalLinesRemoved)
|
|
329
|
+
params.set('linesRemoved', String(conv.totalLinesRemoved));
|
|
330
|
+
const qs = params.toString();
|
|
331
|
+
const meta = {
|
|
332
|
+
path: `cursor://${conv.composerId}${qs ? '?' + qs : ''}`,
|
|
333
|
+
source: 'cursor',
|
|
334
|
+
sessionId: conv.composerId,
|
|
335
|
+
projectDir: encodeDirPath(ws.projectDir),
|
|
336
|
+
isSubagent: false,
|
|
337
|
+
};
|
|
338
|
+
const projectName = displayNameFromDir(meta.projectDir);
|
|
339
|
+
try {
|
|
340
|
+
await ensureSessionIndexed(db, meta, projectName);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Will be caught on next full sync
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Run initial poll immediately
|
|
349
|
+
poll().catch(() => { });
|
|
350
|
+
const timer = setInterval(() => {
|
|
351
|
+
poll().catch(() => { });
|
|
352
|
+
}, intervalMs);
|
|
353
|
+
return () => {
|
|
354
|
+
clearInterval(timer);
|
|
355
|
+
lastSeen.clear();
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { RawEntry } from './parsers/types.js';
|
|
2
|
+
export interface TranscriptMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
role: 'user' | 'assistant';
|
|
6
|
+
blocks: TranscriptBlock[];
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export type TranscriptBlock = TranscriptTextBlock | TranscriptThinkingBlock | TranscriptToolCallBlock;
|
|
10
|
+
export interface TranscriptTextBlock {
|
|
11
|
+
type: 'text';
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TranscriptThinkingBlock {
|
|
15
|
+
type: 'thinking';
|
|
16
|
+
text: string;
|
|
17
|
+
}
|
|
18
|
+
export interface TranscriptToolCallBlock {
|
|
19
|
+
type: 'tool_call';
|
|
20
|
+
toolCallId: string;
|
|
21
|
+
toolName: string;
|
|
22
|
+
/** Primary input: file path, command, pattern, or JSON summary */
|
|
23
|
+
input: string;
|
|
24
|
+
/** Full structured input for rendering tool-specific views */
|
|
25
|
+
inputData?: Record<string, unknown>;
|
|
26
|
+
/** Tool output (truncated if large) */
|
|
27
|
+
output?: string;
|
|
28
|
+
/** Whether output was truncated */
|
|
29
|
+
outputTruncated?: boolean;
|
|
30
|
+
/** Whether the tool call errored */
|
|
31
|
+
isError?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface TranscriptResponse {
|
|
34
|
+
messages: TranscriptMessage[];
|
|
35
|
+
meta: {
|
|
36
|
+
totalMessages: number;
|
|
37
|
+
totalTokens: {
|
|
38
|
+
input: number;
|
|
39
|
+
output: number;
|
|
40
|
+
};
|
|
41
|
+
models: string[];
|
|
42
|
+
duration: {
|
|
43
|
+
activeMinutes: number;
|
|
44
|
+
wallClockMinutes: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build a structured transcript from raw JSONL entries.
|
|
50
|
+
*
|
|
51
|
+
* Two-pass algorithm:
|
|
52
|
+
* 1. Collect all tool_result blocks keyed by tool_use_id
|
|
53
|
+
* 2. Walk entries, build messages, pair tool calls with results
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildTranscript(entries: RawEntry[], cwd?: string): TranscriptMessage[];
|
|
56
|
+
/**
|
|
57
|
+
* Build transcript with metadata for the API response.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildTranscriptResponse(entries: RawEntry[], opts?: {
|
|
60
|
+
cwd?: string;
|
|
61
|
+
activeMinutes?: number;
|
|
62
|
+
wallClockMinutes?: number;
|
|
63
|
+
tokenUsage?: {
|
|
64
|
+
input_tokens: number;
|
|
65
|
+
output_tokens: number;
|
|
66
|
+
};
|
|
67
|
+
modelsUsed?: string[];
|
|
68
|
+
}): TranscriptResponse;
|