@spool-lab/core 0.5.1 → 0.6.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.
- package/dist/db/db.d.ts +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +159 -2
- package/dist/db/db.js.map +1 -1
- package/dist/db/published-shares-cache.d.ts +39 -0
- package/dist/db/published-shares-cache.d.ts.map +1 -0
- package/dist/db/published-shares-cache.js +60 -0
- package/dist/db/published-shares-cache.js.map +1 -0
- package/dist/db/queries.d.ts +58 -2
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +210 -26
- package/dist/db/queries.js.map +1 -1
- package/dist/db/search-query.d.ts +7 -0
- package/dist/db/search-query.d.ts.map +1 -1
- package/dist/db/search-query.js +26 -0
- package/dist/db/search-query.js.map +1 -1
- package/dist/db/share-drafts.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/worktree-identity-upgrade.d.ts +5 -3
- package/dist/migrations/worktree-identity-upgrade.d.ts.map +1 -1
- package/dist/migrations/worktree-identity-upgrade.js +23 -2
- package/dist/migrations/worktree-identity-upgrade.js.map +1 -1
- package/dist/observability/exporter-file.d.ts.map +1 -1
- package/dist/observability/exporter-pretty.d.ts.map +1 -1
- package/dist/observability/exporter-pretty.js.map +1 -1
- package/dist/parsers/claude.d.ts.map +1 -1
- package/dist/parsers/claude.js +4 -144
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.d.ts +7 -1
- package/dist/parsers/codex.d.ts.map +1 -1
- package/dist/parsers/codex.js +47 -177
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/gemini.d.ts.map +1 -1
- package/dist/parsers/gemini.js +102 -2
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/pi.d.ts +18 -0
- package/dist/parsers/pi.d.ts.map +1 -0
- package/dist/parsers/pi.js +154 -0
- package/dist/parsers/pi.js.map +1 -0
- package/dist/parsers/spool-prelude.d.ts +1 -15
- package/dist/parsers/spool-prelude.d.ts.map +1 -1
- package/dist/parsers/spool-prelude.js +3 -20
- package/dist/parsers/spool-prelude.js.map +1 -1
- package/dist/projects/groups.d.ts +4 -1
- package/dist/projects/groups.d.ts.map +1 -1
- package/dist/projects/groups.js +26 -9
- package/dist/projects/groups.js.map +1 -1
- package/dist/projects/identity.d.ts +1 -1
- package/dist/projects/identity.d.ts.map +1 -1
- package/dist/projects/identity.js +12 -1
- package/dist/projects/identity.js.map +1 -1
- package/dist/projects/sessions.js.map +1 -1
- package/dist/projects/worktree-resolvers.d.ts +3 -0
- package/dist/projects/worktree-resolvers.d.ts.map +1 -1
- package/dist/projects/worktree-resolvers.js +130 -2
- package/dist/projects/worktree-resolvers.js.map +1 -1
- package/dist/security/profile.d.ts.map +1 -1
- package/dist/security/profile.js +2 -3
- package/dist/security/profile.js.map +1 -1
- package/dist/security/purge.d.ts +16 -11
- package/dist/security/purge.d.ts.map +1 -1
- package/dist/security/purge.js +165 -24
- package/dist/security/purge.js.map +1 -1
- package/dist/security/types.d.ts +1 -1
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/worker.d.ts.map +1 -1
- package/dist/security/worker.js +44 -8
- package/dist/security/worker.js.map +1 -1
- package/dist/sync/source-paths.d.ts.map +1 -1
- package/dist/sync/source-paths.js +47 -11
- package/dist/sync/source-paths.js.map +1 -1
- package/dist/sync/syncer.d.ts +59 -1
- package/dist/sync/syncer.d.ts.map +1 -1
- package/dist/sync/syncer.js +172 -36
- package/dist/sync/syncer.js.map +1 -1
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +3 -1
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/util/resolve-bin.js.map +1 -1
- package/package.json +7 -4
package/dist/security/worker.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Implementation: Effect Scope A. Inside this module is Effect-shaped
|
|
5
5
|
// (Queue, Stream, PubSub, Ref, Scope). The boundary — IPC handlers
|
|
6
|
-
// in `
|
|
6
|
+
// in `apps/app/src/main/ipc/security.ts` — wraps `runFiber` /
|
|
7
7
|
// `runPromise` so renderers see plain Promise-shaped channels.
|
|
8
8
|
//
|
|
9
9
|
// Single-fiber by design (`concurrency: 1` on the queue stream).
|
|
@@ -34,9 +34,11 @@ export function makeScanWorker(config) {
|
|
|
34
34
|
currentProfile: resolveProfile(config),
|
|
35
35
|
});
|
|
36
36
|
const publish = (c) => PubSub.publish(events, c).pipe(Effect.asVoid);
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
37
|
+
// Mutate statusRef in place WITHOUT publishing — used as the
|
|
38
|
+
// building block for `updateStatus` (which publishes after
|
|
39
|
+
// mutating) and for the bulk-enqueue path in rescanAll / backfill
|
|
40
|
+
// (which mutates per session but publishes only once at the end of
|
|
41
|
+
// the burst).
|
|
40
42
|
//
|
|
41
43
|
// `backfillTotal` is derived here so individual mutation sites
|
|
42
44
|
// (enqueue / rescanAll / backfill / scanOne) don't have to
|
|
@@ -47,7 +49,7 @@ export function makeScanWorker(config) {
|
|
|
47
49
|
// navigation: a user who switches tabs mid-burst and comes back
|
|
48
50
|
// gets the true original total via `getStatus`, not the
|
|
49
51
|
// remaining-at-remount-time approximation.
|
|
50
|
-
const
|
|
52
|
+
const mutateStatus = (f) => Ref.update(statusRef, (prev) => {
|
|
51
53
|
const after = f(prev);
|
|
52
54
|
// High-water mark of *backfillRemaining alone*. Including the
|
|
53
55
|
// scanning slot (br + 1 when scanning != null) bumped the
|
|
@@ -72,7 +74,21 @@ export function makeScanWorker(config) {
|
|
|
72
74
|
// sees a stale truth across burst boundaries.
|
|
73
75
|
const manualBurstInFlight = fullyIdle ? false : after.manualBurstInFlight;
|
|
74
76
|
return { ...after, backfillTotal, manualBurstInFlight };
|
|
75
|
-
})
|
|
77
|
+
});
|
|
78
|
+
/** Publish the current statusRef snapshot to the statusChanges
|
|
79
|
+
* PubSub. Subscribers (the main-process forwarder fiber that
|
|
80
|
+
* pushes to the renderer) wake up once per call. */
|
|
81
|
+
const publishStatus = Ref.get(statusRef).pipe(Effect.flatMap((s) => PubSub.publish(statusEvents, s)), Effect.asVoid);
|
|
82
|
+
/** Mutate statusRef AND publish the new snapshot so subscribers
|
|
83
|
+
* get a push event for every mutation. The single-session
|
|
84
|
+
* `enqueue` (and every scanOne lifecycle step) uses this; bulk
|
|
85
|
+
* enqueue paths use `mutateStatus` + a single `publishStatus`
|
|
86
|
+
* at the end of the burst instead, so a 1000-session rescanAll
|
|
87
|
+
* fans out into one IPC event for the renderer rather than
|
|
88
|
+
* one-per-session (and one React render rather than one per
|
|
89
|
+
* session — the original purge-bulk problem in a different
|
|
90
|
+
* shape). */
|
|
91
|
+
const updateStatus = (f) => mutateStatus(f).pipe(Effect.zipRight(publishStatus));
|
|
76
92
|
// Burst-reset variant for backfill() (and any future caller that
|
|
77
93
|
// means "start a fresh burst, discard whatever the previous one
|
|
78
94
|
// had queued"). Two differences from updateStatus:
|
|
@@ -145,6 +161,16 @@ export function makeScanWorker(config) {
|
|
|
145
161
|
yield* Queue.offer(queue, sessionId);
|
|
146
162
|
yield* updateStatus((s) => ({ ...s, queued: s.queued + 1 }));
|
|
147
163
|
});
|
|
164
|
+
/** Queue + mutate without publishing. Used by rescanAll / backfill
|
|
165
|
+
* to fold N sessions worth of status mutations into a single
|
|
166
|
+
* publish at the end of the burst. Each `Queue.offer` runs as a
|
|
167
|
+
* separate Effect step, so the drain fiber can pull and process
|
|
168
|
+
* items concurrently — `mutateStatus` ensures the per-item
|
|
169
|
+
* increment is atomic with the Ref state the drain reads. */
|
|
170
|
+
const enqueueSilent = (sessionId) => Effect.gen(function* () {
|
|
171
|
+
yield* Queue.offer(queue, sessionId);
|
|
172
|
+
yield* mutateStatus((s) => ({ ...s, queued: s.queued + 1 }));
|
|
173
|
+
});
|
|
148
174
|
const rescanAll = () => Effect.gen(function* () {
|
|
149
175
|
// SELECT and UPDATE share one transaction so a concurrent sync
|
|
150
176
|
// that inserts a new session can't slip between them — the
|
|
@@ -170,8 +196,14 @@ export function makeScanWorker(config) {
|
|
|
170
196
|
manualBurstInFlight: true,
|
|
171
197
|
}));
|
|
172
198
|
for (const r of all) {
|
|
173
|
-
yield*
|
|
199
|
+
yield* enqueueSilent(r.id);
|
|
174
200
|
}
|
|
201
|
+
// Single publish at the end of the burst — collapses N IPC
|
|
202
|
+
// hops to the renderer into one (the previous per-item path
|
|
203
|
+
// hit the same "1000 React renders for a 1000-session
|
|
204
|
+
// archive" shape the bulk purge had before #346).
|
|
205
|
+
if (all.length > 0)
|
|
206
|
+
yield* publishStatus;
|
|
175
207
|
yield* Effect.annotateCurrentSpan('enqueued', all.length);
|
|
176
208
|
return all.length;
|
|
177
209
|
}).pipe(Effect.withSpan('security.worker.rescan_all'));
|
|
@@ -195,8 +227,12 @@ export function makeScanWorker(config) {
|
|
|
195
227
|
manualBurstInFlight: opts?.userInitiated === true,
|
|
196
228
|
}));
|
|
197
229
|
for (const id of stale) {
|
|
198
|
-
yield*
|
|
230
|
+
yield* enqueueSilent(id);
|
|
199
231
|
}
|
|
232
|
+
// Single publish at the end of the burst (see rescanAll for
|
|
233
|
+
// the rationale — same fan-out shape).
|
|
234
|
+
if (stale.length > 0)
|
|
235
|
+
yield* publishStatus;
|
|
200
236
|
yield* Effect.annotateCurrentSpan('enqueued', stale.length);
|
|
201
237
|
yield* Effect.annotateCurrentSpan('userInitiated', opts?.userInitiated === true);
|
|
202
238
|
return stale.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/security/worker.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,mEAAmE;AACnE,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/security/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-paths.d.ts","sourceRoot":"","sources":["../../src/sync/source-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"source-paths.d.ts","sourceRoot":"","sources":["../../src/sync/source-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AA0BhD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAwC/D;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,CAM1C,GACA,aAAa,GAAG,SAAS,CAO3B;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,WAA0B,GAC9B,MAAM,EAAE,CAWV;AA2ED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA2BrG"}
|
|
@@ -11,6 +11,7 @@ const SOURCE_ENV_VARS = {
|
|
|
11
11
|
codex: 'SPOOL_CODEX_DIR',
|
|
12
12
|
gemini: 'SPOOL_GEMINI_DIR',
|
|
13
13
|
opencode: 'SPOOL_OPENCODE_DIR',
|
|
14
|
+
pi: 'SPOOL_PI_DIR',
|
|
14
15
|
};
|
|
15
16
|
const SOURCE_DEFAULT_BASES = {
|
|
16
17
|
claude: '.claude',
|
|
@@ -26,11 +27,18 @@ export function getSessionRoots(source) {
|
|
|
26
27
|
return dedupePaths(splitConfiguredPaths(configured).map(path => normalizeSourceRoot(source, path)));
|
|
27
28
|
}
|
|
28
29
|
if (source === 'gemini') {
|
|
29
|
-
return dedupePaths([
|
|
30
|
+
return dedupePaths([
|
|
31
|
+
normalizeSourceRoot('gemini', join(getGeminiBaseDir(), 'tmp')),
|
|
32
|
+
]);
|
|
30
33
|
}
|
|
31
34
|
if (source === 'opencode') {
|
|
32
35
|
return dedupePaths([normalizeSourceRoot('opencode', getOpenCodeBaseDir())]);
|
|
33
36
|
}
|
|
37
|
+
if (source === 'pi') {
|
|
38
|
+
return dedupePaths([
|
|
39
|
+
normalizeSourceRoot('pi', join(homedir(), '.pi', 'agent', 'sessions')),
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
34
42
|
const home = homedir();
|
|
35
43
|
const childDir = SOURCE_DIR_NAMES[source];
|
|
36
44
|
const roots = [join(home, SOURCE_DEFAULT_BASES[source], childDir)];
|
|
@@ -54,8 +62,9 @@ export function detectSessionSource(filePath, sourceRoots = {
|
|
|
54
62
|
codex: getSessionRoots('codex'),
|
|
55
63
|
gemini: getSessionRoots('gemini'),
|
|
56
64
|
opencode: getSessionRoots('opencode'),
|
|
65
|
+
pi: getSessionRoots('pi'),
|
|
57
66
|
}) {
|
|
58
|
-
for (const source of ['claude', 'codex', 'gemini', 'opencode']) {
|
|
67
|
+
for (const source of ['claude', 'codex', 'gemini', 'opencode', 'pi']) {
|
|
59
68
|
if (sourceRoots[source]?.some(root => isSessionFileForSource(source, filePath, root))) {
|
|
60
69
|
return source;
|
|
61
70
|
}
|
|
@@ -63,11 +72,15 @@ export function detectSessionSource(filePath, sourceRoots = {
|
|
|
63
72
|
return undefined;
|
|
64
73
|
}
|
|
65
74
|
export function getSessionWatchPatterns(source, roots = getSessionRoots(source)) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
if (source === 'gemini') {
|
|
76
|
+
return roots.flatMap(root => [
|
|
77
|
+
join(root, '**', 'session-*.json'),
|
|
78
|
+
join(root, '**', 'session-*.jsonl'),
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
const pattern = source === 'opencode'
|
|
82
|
+
? OPENCODE_DB_NAME
|
|
83
|
+
: '*.jsonl';
|
|
71
84
|
return roots.map(root => join(root, '**', pattern));
|
|
72
85
|
}
|
|
73
86
|
function splitConfiguredPaths(value) {
|
|
@@ -80,6 +93,9 @@ function splitConfiguredPaths(value) {
|
|
|
80
93
|
function normalizeSourceRoot(source, filePath) {
|
|
81
94
|
const resolvedPath = resolve(expandHome(filePath));
|
|
82
95
|
if (source === 'gemini') {
|
|
96
|
+
if (basename(resolvedPath) === 'tmp') {
|
|
97
|
+
return resolvedPath;
|
|
98
|
+
}
|
|
83
99
|
if (basename(resolvedPath) === '.gemini' || existsSync(join(resolvedPath, 'tmp'))) {
|
|
84
100
|
return join(resolvedPath, 'tmp');
|
|
85
101
|
}
|
|
@@ -98,6 +114,15 @@ function normalizeSourceRoot(source, filePath) {
|
|
|
98
114
|
}
|
|
99
115
|
return resolvedPath;
|
|
100
116
|
}
|
|
117
|
+
if (source === 'pi') {
|
|
118
|
+
if (basename(resolvedPath) === 'sessions')
|
|
119
|
+
return resolvedPath;
|
|
120
|
+
if (existsSync(join(resolvedPath, 'agent', 'sessions')))
|
|
121
|
+
return join(resolvedPath, 'agent', 'sessions');
|
|
122
|
+
if (existsSync(join(resolvedPath, 'sessions')))
|
|
123
|
+
return join(resolvedPath, 'sessions');
|
|
124
|
+
return resolvedPath;
|
|
125
|
+
}
|
|
101
126
|
const childDir = SOURCE_DIR_NAMES[source];
|
|
102
127
|
if (basename(resolvedPath) === childDir)
|
|
103
128
|
return resolvedPath;
|
|
@@ -133,20 +158,31 @@ export function isSessionFileForSource(source, filePath, root) {
|
|
|
133
158
|
if (!isWithinRoot(filePath, root))
|
|
134
159
|
return false;
|
|
135
160
|
if (source === 'gemini') {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
161
|
+
if (!filePath.endsWith('.json') && !filePath.endsWith('.jsonl'))
|
|
162
|
+
return false;
|
|
163
|
+
if (!basename(filePath).startsWith('session-'))
|
|
164
|
+
return false;
|
|
165
|
+
if (!/(?:^|\/)chats\//.test(filePath))
|
|
166
|
+
return false;
|
|
167
|
+
// Resuming a legacy session in gemini-cli ≥0.39 migrates it to a sibling
|
|
168
|
+
// .jsonl with the same basename and sessionId, leaving the stale .json in
|
|
169
|
+
// place. Index only the live .jsonl — syncing both makes the two files
|
|
170
|
+
// clobber each other's session row via UNIQUE(session_uuid) on every scan.
|
|
171
|
+
if (filePath.endsWith('.json') && existsSync(`${filePath}l`))
|
|
172
|
+
return false;
|
|
173
|
+
return true;
|
|
139
174
|
}
|
|
140
175
|
if (source === 'opencode') {
|
|
141
176
|
return isOpenCodeDatabaseFile(filePath);
|
|
142
177
|
}
|
|
143
178
|
if (!filePath.endsWith('.jsonl'))
|
|
144
179
|
return false;
|
|
145
|
-
if (source === 'claude') {
|
|
180
|
+
if (source === 'claude' || source === 'pi') {
|
|
146
181
|
// Claude sessions live at <root>/<slug>/<uuid>.jsonl — exactly two segments
|
|
147
182
|
// relative to root. Nested files (e.g. <slug>/<uuid>/subagents/agent-*.jsonl)
|
|
148
183
|
// are subagent scratchpads that share the parent's sessionId; indexing them
|
|
149
184
|
// clobbers the parent row via UNIQUE(session_uuid) and zeros message_count.
|
|
185
|
+
// Pi uses the same <root>/<cwd-slug>/<timestamp>_<uuid>.jsonl layout.
|
|
150
186
|
const rel = relative(root, filePath);
|
|
151
187
|
return rel.length > 0 && rel.split(sep).length === 2;
|
|
152
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-paths.js","sourceRoot":"","sources":["../../src/sync/source-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAElG,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEjF,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"source-paths.js","sourceRoot":"","sources":["../../src/sync/source-paths.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/syncer.d.ts
CHANGED
|
@@ -13,6 +13,18 @@ export type SyncEventCallback = (event: SyncProgressEvent) => void;
|
|
|
13
13
|
* the findings table point into the now-mutated `messages.content_text`.
|
|
14
14
|
* Receives the sessions.id, NOT the session_uuid. */
|
|
15
15
|
export type SessionChangedCallback = (sessionId: number) => void;
|
|
16
|
+
/** Per-call overrides for {@link Syncer.syncFile}. The watcher and
|
|
17
|
+
* `syncAll` never pass these — they go through the standard
|
|
18
|
+
* mtime-skip + classifySync path. The "Refresh from source" user
|
|
19
|
+
* action sets `forceMode: 'rewrite'` to bypass both gates so a
|
|
20
|
+
* session that looks identical at the uuid/length surface gets
|
|
21
|
+
* rebuilt from the source jsonl anyway. */
|
|
22
|
+
export interface SyncFileOptions {
|
|
23
|
+
/** Bypass classifySync and mtime-skip. Used by the explicit
|
|
24
|
+
* "Refresh from source" IPC action; not set by the watcher or
|
|
25
|
+
* syncAll. */
|
|
26
|
+
forceMode?: 'rewrite';
|
|
27
|
+
}
|
|
16
28
|
export declare class Syncer {
|
|
17
29
|
private db;
|
|
18
30
|
private onProgress;
|
|
@@ -20,8 +32,54 @@ export declare class Syncer {
|
|
|
20
32
|
private codexTitleIndex;
|
|
21
33
|
constructor(db: Database.Database, onProgress?: SyncEventCallback, onSessionChanged?: SessionChangedCallback);
|
|
22
34
|
syncAll(): SyncResult;
|
|
35
|
+
/** Decide whether a re-sync of `sessionUuid` against `parsed` is a
|
|
36
|
+
* pure append (existing rows untouched, new uuids inserted) or
|
|
37
|
+
* needs the safer DELETE+INSERT rewrite path.
|
|
38
|
+
*
|
|
39
|
+
* Rewrite signals (any of):
|
|
40
|
+
* - Session row doesn't exist yet → trivially a first-sync,
|
|
41
|
+
* collapsed into `rewrite` because the code paths are
|
|
42
|
+
* identical when there's nothing to preserve.
|
|
43
|
+
* - Session row exists but has no msg_uuid-bearing message rows
|
|
44
|
+
* (orphan / corrupt state) → safest to repopulate from scratch.
|
|
45
|
+
* - Parser returned no messages but DB has some — almost certainly
|
|
46
|
+
* a parse failure mid-flight; rewrite would wipe data the
|
|
47
|
+
* source no longer has, which is the user's intent.
|
|
48
|
+
* - Parser returned fewer messages than DB has — source was
|
|
49
|
+
* truncated or rewritten from its head; uuids beyond the new
|
|
50
|
+
* tail are stale and must be re-derived.
|
|
51
|
+
* - The first stored uuid no longer matches the parser's first
|
|
52
|
+
* uuid → leading prefix shifted; preserved tail uuids could
|
|
53
|
+
* now point at semantically-different records.
|
|
54
|
+
*
|
|
55
|
+
* Anything else is `append`.
|
|
56
|
+
*
|
|
57
|
+
* Note: we deliberately do NOT auto-detect in-place edits of an
|
|
58
|
+
* existing message uuid (same uuid, different content_text on the
|
|
59
|
+
* source side). Two reasons:
|
|
60
|
+
*
|
|
61
|
+
* 1. Source files for every supported provider (claude / codex /
|
|
62
|
+
* gemini / opencode) are append-only event logs at the tool
|
|
63
|
+
* contract level. Real in-place edits only happen when a user
|
|
64
|
+
* manually edits the jsonl on disk — rare, deliberate, and
|
|
65
|
+
* best handled by an explicit "Refresh from source" action.
|
|
66
|
+
* 2. After a Security Scan purge, `messages.content_text` is the
|
|
67
|
+
* mask but the source still has the raw value. A naive
|
|
68
|
+
* content-compare would see the difference and trigger
|
|
69
|
+
* rewrite, which would cascade-delete the finding and let the
|
|
70
|
+
* raw value re-enter the DB — exactly the regression that
|
|
71
|
+
* motivated this work. The purge protection requires that we
|
|
72
|
+
* NOT chase content drift on uuid-matched messages. */
|
|
73
|
+
private classifySync;
|
|
74
|
+
/** True if the title we'd write differs from what's currently stored
|
|
75
|
+
* for this session. Lets the syncer skip the session_search rebuild
|
|
76
|
+
* on no-op mtime touches without losing title-only updates (e.g.
|
|
77
|
+
* codex's auto-titling pass via applyCodexTitles, or a claude
|
|
78
|
+
* custom-title record landing while everything else stays the
|
|
79
|
+
* same). */
|
|
80
|
+
private titleDiffersFromStored;
|
|
23
81
|
private applyCodexTitles;
|
|
24
|
-
syncFile(filePath: string, source: SessionSource, knownMtimes?: Map<string, string>, precomputedMtime?: string): 'added' | 'updated' | 'skipped' | 'error';
|
|
82
|
+
syncFile(filePath: string, source: SessionSource, knownMtimes?: Map<string, string>, precomputedMtime?: string, options?: SyncFileOptions): 'added' | 'updated' | 'skipped' | 'error';
|
|
25
83
|
private syncOpenCodeDatabase;
|
|
26
84
|
}
|
|
27
85
|
//# sourceMappingURL=syncer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/sync/syncer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/sync/syncer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAa1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAehD,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAA;AAI5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;AAElE;;;;sDAIsD;AACtD,MAAM,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;AAEhE;;;;;4CAK4C;AAC5C,MAAM,WAAW,eAAe;IAC9B;;mBAEe;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,eAAe,CAAiC;IAExD,YACE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,CAAC,EAAE,iBAAiB,EAC9B,gBAAgB,CAAC,EAAE,sBAAsB,EAK1C;IAED,OAAO,IAAI,UAAU,CAsFpB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEAqC6D;IAC7D,OAAO,CAAC,YAAY;IA0BpB;;;;;iBAKa;IACb,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,gBAAgB;IAaxB,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAkL3C;IAED,OAAO,CAAC,oBAAoB;CAwC7B"}
|