@spool-lab/core 0.3.5 → 0.4.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/LICENSE +11 -0
- package/README.md +8 -5
- package/dist/connectors/npm-install.d.ts.map +1 -1
- package/dist/connectors/npm-install.js +3 -0
- package/dist/connectors/npm-install.js.map +1 -1
- package/dist/connectors/sync-engine.d.ts +1 -0
- package/dist/connectors/sync-engine.d.ts.map +1 -1
- package/dist/connectors/sync-engine.js +17 -2
- package/dist/connectors/sync-engine.js.map +1 -1
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/connectors/types.js +2 -2
- package/dist/connectors/types.js.map +1 -1
- package/dist/db/db.d.ts +4 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +103 -121
- package/dist/db/db.js.map +1 -1
- package/dist/db/queries.d.ts +9 -14
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +85 -179
- package/dist/db/queries.js.map +1 -1
- package/dist/index.d.ts +0 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -14
- package/dist/index.js.map +1 -1
- package/dist/sync/watcher.d.ts +38 -8
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +158 -43
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -18
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -10
package/dist/sync/watcher.d.ts
CHANGED
|
@@ -1,19 +1,49 @@
|
|
|
1
|
+
import { watch as fsWatch } from 'node:fs';
|
|
1
2
|
import type { Syncer } from './syncer.js';
|
|
2
|
-
export type WatcherEvent = 'new-sessions';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
export type WatcherEvent = 'new-sessions' | 'error';
|
|
4
|
+
export interface WatcherEventDataMap {
|
|
5
|
+
'new-sessions': {
|
|
6
|
+
count: number;
|
|
7
|
+
};
|
|
8
|
+
'error': {
|
|
9
|
+
error: Error;
|
|
10
|
+
root?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export type WatcherEventData = WatcherEventDataMap[WatcherEvent];
|
|
14
|
+
export type WatcherEventCallback<E extends WatcherEvent = WatcherEvent> = (event: E, data: WatcherEventDataMap[E]) => void;
|
|
15
|
+
export interface SpoolWatcherOptions {
|
|
16
|
+
/** Milliseconds of inactivity before considering a file's writes finished. */
|
|
17
|
+
stabilityMs?: number;
|
|
18
|
+
/** Poll interval while waiting for size/mtime to settle. */
|
|
19
|
+
pollMs?: number;
|
|
20
|
+
/** Window over which new-session events coalesce into a single emission. */
|
|
21
|
+
flushMs?: number;
|
|
22
|
+
/** Dependency injection for tests — defaults to node:fs watch. */
|
|
23
|
+
watchFn?: typeof fsWatch;
|
|
24
|
+
}
|
|
6
25
|
export declare class SpoolWatcher {
|
|
7
26
|
private syncer;
|
|
8
|
-
private
|
|
27
|
+
private watchers;
|
|
9
28
|
private listeners;
|
|
29
|
+
private pending;
|
|
10
30
|
private pendingNew;
|
|
11
31
|
private flushTimer;
|
|
12
32
|
private sourceRoots;
|
|
13
|
-
|
|
33
|
+
private stopped;
|
|
34
|
+
private readonly stabilityMs;
|
|
35
|
+
private readonly pollMs;
|
|
36
|
+
private readonly flushMs;
|
|
37
|
+
private readonly watchFn;
|
|
38
|
+
constructor(syncer: Syncer, opts?: SpoolWatcherOptions);
|
|
14
39
|
start(): void;
|
|
15
40
|
stop(): void;
|
|
16
|
-
on(event:
|
|
17
|
-
private
|
|
41
|
+
on<E extends WatcherEvent>(event: E, cb: WatcherEventCallback<E>): void;
|
|
42
|
+
private watchRoot;
|
|
43
|
+
private schedulePoll;
|
|
44
|
+
private pollStability;
|
|
45
|
+
private runSync;
|
|
46
|
+
private flushNew;
|
|
47
|
+
private emit;
|
|
18
48
|
}
|
|
19
49
|
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,OAAO,EAA4B,MAAM,SAAS,CAAA;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAIzC,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,OAAO,CAAA;AAEnD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACzC;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAA;AAEhE,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CACxE,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,KACzB,IAAI,CAAA;AAET,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,OAAO,CAAA;CACzB;AAYD,qBAAa,YAAY;IAaX,OAAO,CAAC,MAAM;IAZ1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAuD;IACxE,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,WAAW,CAAyE;IAC5F,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB;IAOlE,KAAK,IAAI,IAAI;IAeb,IAAI,IAAI,IAAI;IAeZ,EAAE,CAAC,CAAC,SAAS,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAMvE,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,OAAO;IAsBf,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,IAAI;CAOb"}
|
package/dist/sync/watcher.js
CHANGED
|
@@ -1,66 +1,181 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { watch as fsWatch, statSync } from 'node:fs';
|
|
2
|
+
import { resolve as resolvePath } from 'node:path';
|
|
3
|
+
import { detectSessionSource, getSessionRoots } from './source-paths.js';
|
|
4
|
+
const DEFAULT_STABILITY_MS = 2000;
|
|
5
|
+
const DEFAULT_POLL_MS = 200;
|
|
6
|
+
const DEFAULT_FLUSH_MS = 500;
|
|
3
7
|
export class SpoolWatcher {
|
|
4
8
|
syncer;
|
|
5
|
-
|
|
6
|
-
listeners =
|
|
9
|
+
watchers = [];
|
|
10
|
+
listeners = new Map();
|
|
11
|
+
pending = new Map();
|
|
7
12
|
pendingNew = 0;
|
|
8
13
|
flushTimer = null;
|
|
9
|
-
sourceRoots = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
sourceRoots = { claude: [], codex: [], gemini: [] };
|
|
15
|
+
stopped = false;
|
|
16
|
+
stabilityMs;
|
|
17
|
+
pollMs;
|
|
18
|
+
flushMs;
|
|
19
|
+
watchFn;
|
|
20
|
+
constructor(syncer, opts = {}) {
|
|
15
21
|
this.syncer = syncer;
|
|
22
|
+
this.stabilityMs = opts.stabilityMs ?? DEFAULT_STABILITY_MS;
|
|
23
|
+
this.pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
|
|
24
|
+
this.flushMs = opts.flushMs ?? DEFAULT_FLUSH_MS;
|
|
25
|
+
this.watchFn = opts.watchFn ?? fsWatch;
|
|
16
26
|
}
|
|
17
27
|
start() {
|
|
28
|
+
this.stopped = false;
|
|
18
29
|
this.sourceRoots = {
|
|
19
30
|
claude: getSessionRoots('claude'),
|
|
20
31
|
codex: getSessionRoots('codex'),
|
|
21
32
|
gemini: getSessionRoots('gemini'),
|
|
22
33
|
};
|
|
23
|
-
const
|
|
24
|
-
...
|
|
25
|
-
...
|
|
26
|
-
...
|
|
34
|
+
const roots = [
|
|
35
|
+
...this.sourceRoots.claude,
|
|
36
|
+
...this.sourceRoots.codex,
|
|
37
|
+
...this.sourceRoots.gemini,
|
|
27
38
|
];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
ignoreInitial: true, // initial sync is done by Syncer.syncAll()
|
|
31
|
-
awaitWriteFinish: {
|
|
32
|
-
stabilityThreshold: 2000,
|
|
33
|
-
pollInterval: 200,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
this.watcher
|
|
37
|
-
.on('add', (path) => this.handleFile(path))
|
|
38
|
-
.on('change', (path) => this.handleFile(path));
|
|
39
|
+
for (const root of roots)
|
|
40
|
+
this.watchRoot(root);
|
|
39
41
|
}
|
|
40
42
|
stop() {
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
|
|
43
|
+
this.stopped = true;
|
|
44
|
+
for (const w of this.watchers) {
|
|
45
|
+
try {
|
|
46
|
+
w.close();
|
|
47
|
+
}
|
|
48
|
+
catch { /* ignore */ }
|
|
49
|
+
}
|
|
50
|
+
this.watchers = [];
|
|
51
|
+
for (const entry of this.pending.values())
|
|
52
|
+
clearTimeout(entry.timer);
|
|
53
|
+
this.pending.clear();
|
|
54
|
+
if (this.flushTimer) {
|
|
44
55
|
clearTimeout(this.flushTimer);
|
|
56
|
+
this.flushTimer = null;
|
|
57
|
+
}
|
|
58
|
+
this.pendingNew = 0;
|
|
45
59
|
}
|
|
46
60
|
on(event, cb) {
|
|
47
|
-
this.listeners.
|
|
61
|
+
const list = this.listeners.get(event) ?? [];
|
|
62
|
+
list.push(cb);
|
|
63
|
+
this.listeners.set(event, list);
|
|
64
|
+
}
|
|
65
|
+
watchRoot(root) {
|
|
66
|
+
let w;
|
|
67
|
+
try {
|
|
68
|
+
w = this.watchFn(root, { persistent: true, recursive: true });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const code = err?.code;
|
|
72
|
+
// Missing root is expected (e.g. user hasn't used Gemini CLI) — silently skip.
|
|
73
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR') {
|
|
74
|
+
this.emit('error', { error: err, root });
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
w.on('change', (_eventType, filename) => {
|
|
79
|
+
if (this.stopped || !filename)
|
|
80
|
+
return;
|
|
81
|
+
const abs = resolvePath(root, filename.toString());
|
|
82
|
+
this.schedulePoll(abs);
|
|
83
|
+
});
|
|
84
|
+
w.on('error', (err) => {
|
|
85
|
+
this.emit('error', { error: err, root });
|
|
86
|
+
});
|
|
87
|
+
this.watchers.push(w);
|
|
88
|
+
}
|
|
89
|
+
schedulePoll(filePath) {
|
|
90
|
+
// Only process files whose final path matches a configured source.
|
|
91
|
+
// Prefilter here avoids noisy stat() on unrelated dir events.
|
|
92
|
+
if (!detectSessionSource(filePath, this.sourceRoots)) {
|
|
93
|
+
// Could still be a future session file in a new subdir — but detectSessionSource
|
|
94
|
+
// already matches by suffix + root containment, so unrelated hits are rejected here.
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const existing = this.pending.get(filePath);
|
|
98
|
+
if (existing)
|
|
99
|
+
clearTimeout(existing.timer);
|
|
100
|
+
const entry = {
|
|
101
|
+
lastSize: existing?.lastSize ?? -1,
|
|
102
|
+
lastMtimeMs: existing?.lastMtimeMs ?? -1,
|
|
103
|
+
timer: setTimeout(() => this.pollStability(filePath), this.stabilityMs),
|
|
104
|
+
};
|
|
105
|
+
this.pending.set(filePath, entry);
|
|
106
|
+
}
|
|
107
|
+
pollStability(filePath) {
|
|
108
|
+
if (this.stopped)
|
|
109
|
+
return;
|
|
110
|
+
const entry = this.pending.get(filePath);
|
|
111
|
+
if (!entry)
|
|
112
|
+
return;
|
|
113
|
+
let size;
|
|
114
|
+
let mtimeMs;
|
|
115
|
+
try {
|
|
116
|
+
const s = statSync(filePath);
|
|
117
|
+
if (!s.isFile()) {
|
|
118
|
+
this.pending.delete(filePath);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
size = s.size;
|
|
122
|
+
mtimeMs = s.mtimeMs;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// File gone or transient error — drop.
|
|
126
|
+
this.pending.delete(filePath);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (size === entry.lastSize && mtimeMs === entry.lastMtimeMs) {
|
|
130
|
+
this.pending.delete(filePath);
|
|
131
|
+
this.runSync(filePath);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
entry.lastSize = size;
|
|
135
|
+
entry.lastMtimeMs = mtimeMs;
|
|
136
|
+
entry.timer = setTimeout(() => this.pollStability(filePath), this.pollMs);
|
|
137
|
+
}
|
|
138
|
+
runSync(filePath) {
|
|
139
|
+
// Decouple the sync call from the watcher event path so a slow or throwing
|
|
140
|
+
// syncFile cannot stall event delivery or create unhandled rejections.
|
|
141
|
+
queueMicrotask(() => {
|
|
142
|
+
if (this.stopped)
|
|
143
|
+
return;
|
|
144
|
+
const source = detectSessionSource(filePath, this.sourceRoots);
|
|
145
|
+
if (!source)
|
|
146
|
+
return;
|
|
147
|
+
let result;
|
|
148
|
+
try {
|
|
149
|
+
result = this.syncer.syncFile(filePath, source);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
this.emit('error', { error: err });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (result === 'added' || result === 'updated') {
|
|
156
|
+
this.pendingNew++;
|
|
157
|
+
if (this.flushTimer)
|
|
158
|
+
clearTimeout(this.flushTimer);
|
|
159
|
+
this.flushTimer = setTimeout(() => this.flushNew(), this.flushMs);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
flushNew() {
|
|
164
|
+
this.flushTimer = null;
|
|
165
|
+
const count = this.pendingNew;
|
|
166
|
+
this.pendingNew = 0;
|
|
167
|
+
if (count > 0)
|
|
168
|
+
this.emit('new-sessions', { count });
|
|
48
169
|
}
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
170
|
+
emit(event, data) {
|
|
171
|
+
const list = this.listeners.get(event);
|
|
172
|
+
if (!list)
|
|
52
173
|
return;
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
clearTimeout(this.flushTimer);
|
|
59
|
-
this.flushTimer = setTimeout(() => {
|
|
60
|
-
const count = this.pendingNew;
|
|
61
|
-
this.pendingNew = 0;
|
|
62
|
-
this.listeners.forEach(cb => cb('new-sessions', { count }));
|
|
63
|
-
}, 500);
|
|
174
|
+
for (const cb of list) {
|
|
175
|
+
try {
|
|
176
|
+
cb(event, data);
|
|
177
|
+
}
|
|
178
|
+
catch { /* listener errors shouldn't break the watcher */ }
|
|
64
179
|
}
|
|
65
180
|
}
|
|
66
181
|
}
|
package/dist/sync/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -90,23 +90,13 @@ export interface SyncResult {
|
|
|
90
90
|
updated: number;
|
|
91
91
|
errors: number;
|
|
92
92
|
}
|
|
93
|
-
export
|
|
94
|
-
rank: number;
|
|
95
|
-
captureId: number;
|
|
96
|
-
captureUuid: string;
|
|
97
|
-
matchType: SearchMatchType;
|
|
98
|
-
url: string;
|
|
99
|
-
title: string;
|
|
100
|
-
snippet: string;
|
|
101
|
-
platform: string;
|
|
102
|
-
contentType: string;
|
|
103
|
-
author: string | null;
|
|
104
|
-
capturedAt: string;
|
|
105
|
-
}
|
|
106
|
-
export type { CapturedItem } from './connectors/types.js';
|
|
107
|
-
export type SearchResult = (FragmentResult & {
|
|
93
|
+
export type SearchResult = FragmentResult & {
|
|
108
94
|
kind: 'fragment';
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
95
|
+
};
|
|
96
|
+
export type StarKind = 'session';
|
|
97
|
+
export type StarredItem = {
|
|
98
|
+
kind: 'session';
|
|
99
|
+
starredAt: string;
|
|
100
|
+
session: Session;
|
|
101
|
+
};
|
|
112
102
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spool-lab/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,24 +18,17 @@
|
|
|
18
18
|
"access": "public"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"better-sqlite3": "^11.10.0"
|
|
22
|
-
"chokidar": "^4.0.3",
|
|
23
|
-
"effect": "^3.21.0",
|
|
24
|
-
"semver": "^7.7.4",
|
|
25
|
-
"tar": "^7.5.13",
|
|
26
|
-
"@spool-lab/connector-sdk": "^0.1.1"
|
|
21
|
+
"better-sqlite3": "^11.10.0"
|
|
27
22
|
},
|
|
28
23
|
"devDependencies": {
|
|
29
|
-
"@effect/vitest": "^0.29.0",
|
|
30
24
|
"@types/better-sqlite3": "^7.6.13",
|
|
31
25
|
"@types/node": "^22.19.17",
|
|
32
|
-
"@types/semver": "^7.7.1",
|
|
33
26
|
"vitest": "^3.2.4"
|
|
34
27
|
},
|
|
35
28
|
"scripts": {
|
|
36
29
|
"rebuild:native": "pnpm run rebuild:native:node",
|
|
37
30
|
"rebuild:native:node": "node ../../scripts/rebuild-better-sqlite3-node.mjs",
|
|
38
|
-
"build": "
|
|
31
|
+
"build": "tsc",
|
|
39
32
|
"dev": "tsc --watch",
|
|
40
33
|
"test": "pnpm run rebuild:native && vitest run",
|
|
41
34
|
"clean": "rm -rf dist"
|