@spool-lab/core 0.3.5 → 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 (81) hide show
  1. package/LICENSE +11 -0
  2. package/README.md +8 -5
  3. package/dist/db/db.d.ts +4 -0
  4. package/dist/db/db.d.ts.map +1 -1
  5. package/dist/db/db.js +103 -121
  6. package/dist/db/db.js.map +1 -1
  7. package/dist/db/queries.d.ts +9 -14
  8. package/dist/db/queries.d.ts.map +1 -1
  9. package/dist/db/queries.js +85 -179
  10. package/dist/db/queries.js.map +1 -1
  11. package/dist/index.d.ts +0 -19
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +0 -14
  14. package/dist/index.js.map +1 -1
  15. package/dist/sync/watcher.d.ts +38 -8
  16. package/dist/sync/watcher.d.ts.map +1 -1
  17. package/dist/sync/watcher.js +158 -43
  18. package/dist/sync/watcher.js.map +1 -1
  19. package/dist/types.d.ts +8 -18
  20. package/dist/types.d.ts.map +1 -1
  21. package/package.json +3 -10
  22. package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
  23. package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
  24. package/dist/connectors/capabilities/cookies-chrome.js +0 -199
  25. package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
  26. package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
  27. package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
  28. package/dist/connectors/capabilities/exec-impl.js +0 -108
  29. package/dist/connectors/capabilities/exec-impl.js.map +0 -1
  30. package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
  31. package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
  32. package/dist/connectors/capabilities/fetch-impl.js +0 -4
  33. package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
  34. package/dist/connectors/capabilities/index.d.ts +0 -6
  35. package/dist/connectors/capabilities/index.d.ts.map +0 -1
  36. package/dist/connectors/capabilities/index.js +0 -6
  37. package/dist/connectors/capabilities/index.js.map +0 -1
  38. package/dist/connectors/capabilities/log-impl.d.ts +0 -3
  39. package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
  40. package/dist/connectors/capabilities/log-impl.js +0 -26
  41. package/dist/connectors/capabilities/log-impl.js.map +0 -1
  42. package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
  43. package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
  44. package/dist/connectors/capabilities/sqlite-impl.js +0 -19
  45. package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
  46. package/dist/connectors/loader.d.ts +0 -47
  47. package/dist/connectors/loader.d.ts.map +0 -1
  48. package/dist/connectors/loader.js +0 -328
  49. package/dist/connectors/loader.js.map +0 -1
  50. package/dist/connectors/npm-install.d.ts +0 -26
  51. package/dist/connectors/npm-install.d.ts.map +0 -1
  52. package/dist/connectors/npm-install.js +0 -71
  53. package/dist/connectors/npm-install.js.map +0 -1
  54. package/dist/connectors/prerequisites.d.ts +0 -14
  55. package/dist/connectors/prerequisites.d.ts.map +0 -1
  56. package/dist/connectors/prerequisites.js +0 -109
  57. package/dist/connectors/prerequisites.js.map +0 -1
  58. package/dist/connectors/registry-fetch.d.ts +0 -22
  59. package/dist/connectors/registry-fetch.d.ts.map +0 -1
  60. package/dist/connectors/registry-fetch.js +0 -54
  61. package/dist/connectors/registry-fetch.js.map +0 -1
  62. package/dist/connectors/registry.d.ts +0 -23
  63. package/dist/connectors/registry.d.ts.map +0 -1
  64. package/dist/connectors/registry.js +0 -59
  65. package/dist/connectors/registry.js.map +0 -1
  66. package/dist/connectors/sync-engine.d.ts +0 -30
  67. package/dist/connectors/sync-engine.d.ts.map +0 -1
  68. package/dist/connectors/sync-engine.js +0 -589
  69. package/dist/connectors/sync-engine.js.map +0 -1
  70. package/dist/connectors/sync-scheduler.d.ts +0 -56
  71. package/dist/connectors/sync-scheduler.d.ts.map +0 -1
  72. package/dist/connectors/sync-scheduler.js +0 -238
  73. package/dist/connectors/sync-scheduler.js.map +0 -1
  74. package/dist/connectors/trust-store.d.ts +0 -13
  75. package/dist/connectors/trust-store.d.ts.map +0 -1
  76. package/dist/connectors/trust-store.js +0 -48
  77. package/dist/connectors/trust-store.js.map +0 -1
  78. package/dist/connectors/types.d.ts +0 -111
  79. package/dist/connectors/types.d.ts.map +0 -1
  80. package/dist/connectors/types.js +0 -50
  81. package/dist/connectors/types.js.map +0 -1
@@ -1,66 +1,181 @@
1
- import chokidar from 'chokidar';
2
- import { detectSessionSource, getSessionRoots, getSessionWatchPatterns } from './source-paths.js';
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
- watcher = null;
6
- listeners = [];
9
+ watchers = [];
10
+ listeners = new Map();
11
+ pending = new Map();
7
12
  pendingNew = 0;
8
13
  flushTimer = null;
9
- sourceRoots = {
10
- claude: [],
11
- codex: [],
12
- gemini: [],
13
- };
14
- constructor(syncer) {
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 patterns = [
24
- ...getSessionWatchPatterns('claude', this.sourceRoots.claude),
25
- ...getSessionWatchPatterns('codex', this.sourceRoots.codex),
26
- ...getSessionWatchPatterns('gemini', this.sourceRoots.gemini),
34
+ const roots = [
35
+ ...this.sourceRoots.claude,
36
+ ...this.sourceRoots.codex,
37
+ ...this.sourceRoots.gemini,
27
38
  ];
28
- this.watcher = chokidar.watch(patterns, {
29
- persistent: true,
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.watcher?.close();
42
- this.watcher = null;
43
- if (this.flushTimer)
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.push(cb);
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
- handleFile(filePath) {
50
- const source = detectSessionSource(filePath, this.sourceRoots);
51
- if (!source)
170
+ emit(event, data) {
171
+ const list = this.listeners.get(event);
172
+ if (!list)
52
173
  return;
53
- const result = this.syncer.syncFile(filePath, source);
54
- if (result === 'added' || result === 'updated') {
55
- this.pendingNew++;
56
- // Debounce: flush all pending new-session events together
57
- if (this.flushTimer)
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}
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 interface CaptureResult {
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
- }) | (CaptureResult & {
110
- kind: 'capture';
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
@@ -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.5",
3
+ "version": "0.4.1",
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": "pnpm --filter @spool-lab/connector-sdk build && tsc",
31
+ "build": "pnpm run clean && tsc",
39
32
  "dev": "tsc --watch",
40
33
  "test": "pnpm run rebuild:native && vitest run",
41
34
  "clean": "rm -rf dist"
@@ -1,19 +0,0 @@
1
- /**
2
- * Chrome cookie extraction for X/Twitter authentication.
3
- *
4
- * Adapted from fieldtheory-cli (https://github.com/afar1/fieldtheory-cli).
5
- * Reads Chrome's encrypted cookie database on macOS, decrypts auth_token and
6
- * ct0 (CSRF) cookies for x.com using the macOS Keychain.
7
- */
8
- import type { CookiesCapability } from '@spool-lab/connector-sdk';
9
- export declare function decryptCookieValue(encryptedValue: Buffer, key: Buffer, dbVersion?: number): string;
10
- /**
11
- * Enumerate every Chrome `host_key` value that should match a request to `host`
12
- * per RFC 6265 §5.1.3. Chrome stores host-only cookies under the bare hostname
13
- * and domain cookies under `.parent.example.com`; a request to `www.example.com`
14
- * must see cookies at `www.example.com`, `.www.example.com`, and `.example.com`
15
- * but not anything scoped to a sibling (`.other.example.com`) or a TLD alone.
16
- */
17
- export declare function getMatchingHostKeys(host: string): string[];
18
- export declare function makeChromeCookiesCapability(): CookiesCapability;
19
- //# sourceMappingURL=cookies-chrome.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cookies-chrome.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/cookies-chrome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,0BAA0B,CAAA;AAmCtF,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,MAAM,CAmB7F;AA0DD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe1D;AAgDD,wBAAgB,2BAA2B,IAAI,iBAAiB,CAoD/D"}
@@ -1,199 +0,0 @@
1
- /**
2
- * Chrome cookie extraction for X/Twitter authentication.
3
- *
4
- * Adapted from fieldtheory-cli (https://github.com/afar1/fieldtheory-cli).
5
- * Reads Chrome's encrypted cookie database on macOS, decrypts auth_token and
6
- * ct0 (CSRF) cookies for x.com using the macOS Keychain.
7
- */
8
- import { execFileSync } from 'node:child_process';
9
- import { existsSync, unlinkSync, copyFileSync } from 'node:fs';
10
- import { join } from 'node:path';
11
- import { tmpdir, platform, homedir } from 'node:os';
12
- import { pbkdf2Sync, createDecipheriv, randomUUID } from 'node:crypto';
13
- import { SyncError, SyncErrorCode } from '@spool-lab/connector-sdk';
14
- function getMacOSChromeKey() {
15
- const candidates = [
16
- { service: 'Chrome Safe Storage', account: 'Chrome' },
17
- { service: 'Chrome Safe Storage', account: 'Google Chrome' },
18
- { service: 'Google Chrome Safe Storage', account: 'Chrome' },
19
- { service: 'Google Chrome Safe Storage', account: 'Google Chrome' },
20
- { service: 'Chromium Safe Storage', account: 'Chromium' },
21
- { service: 'Brave Safe Storage', account: 'Brave' },
22
- { service: 'Brave Browser Safe Storage', account: 'Brave Browser' },
23
- ];
24
- for (const candidate of candidates) {
25
- try {
26
- const password = execFileSync('security', ['find-generic-password', '-w', '-s', candidate.service, '-a', candidate.account], { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
27
- if (password) {
28
- return pbkdf2Sync(password, 'saltysalt', 1003, 16, 'sha1');
29
- }
30
- }
31
- catch {
32
- // Try the next known browser/keychain naming pair.
33
- }
34
- }
35
- throw new SyncError(SyncErrorCode.AUTH_KEYCHAIN_DENIED, 'Could not read a browser Safe Storage password from the macOS Keychain.');
36
- }
37
- export function decryptCookieValue(encryptedValue, key, dbVersion = 0) {
38
- if (encryptedValue.length === 0)
39
- return '';
40
- if (encryptedValue[0] === 0x76 && encryptedValue[1] === 0x31 && encryptedValue[2] === 0x30) {
41
- const iv = Buffer.alloc(16, 0x20); // 16 spaces
42
- const ciphertext = encryptedValue.subarray(3);
43
- const decipher = createDecipheriv('aes-128-cbc', key, iv);
44
- let decrypted = decipher.update(ciphertext);
45
- decrypted = Buffer.concat([decrypted, decipher.final()]);
46
- // Chrome DB version >= 24 (Chrome ~130+) prepends SHA256(host_key) to plaintext
47
- if (dbVersion >= 24 && decrypted.length > 32) {
48
- decrypted = decrypted.subarray(32);
49
- }
50
- return decrypted.toString('utf8');
51
- }
52
- return encryptedValue.toString('utf8');
53
- }
54
- function detectChromeUserDataDir() {
55
- const os = platform();
56
- const home = homedir();
57
- if (os === 'darwin')
58
- return join(home, 'Library', 'Application Support', 'Google', 'Chrome');
59
- if (os === 'linux')
60
- return join(home, '.config', 'google-chrome');
61
- if (os === 'win32')
62
- return join(home, 'AppData', 'Local', 'Google', 'Chrome', 'User Data');
63
- throw new SyncError(SyncErrorCode.AUTH_CHROME_NOT_FOUND, `Unsupported platform for Chrome cookie extraction: ${os}`);
64
- }
65
- /**
66
- * Run a sqlite3 query with fallback to a temp copy (Chrome locks the DB while running).
67
- * Returns raw stdout string.
68
- */
69
- function runSqliteQuery(dbPath, sql) {
70
- const tryQuery = (path) => execFileSync('sqlite3', ['-json', path, sql], {
71
- encoding: 'utf8',
72
- stdio: ['pipe', 'pipe', 'pipe'],
73
- timeout: 10000,
74
- }).trim();
75
- try {
76
- return tryQuery(dbPath);
77
- }
78
- catch {
79
- const tmpDb = join(tmpdir(), `spool-cookies-${randomUUID()}.db`);
80
- try {
81
- copyFileSync(dbPath, tmpDb);
82
- return tryQuery(tmpDb);
83
- }
84
- catch (e2) {
85
- throw new SyncError(SyncErrorCode.AUTH_COOKIE_DECRYPT_FAILED, `Could not read Chrome Cookies database at ${dbPath}. ${e2 instanceof Error ? e2.message : ''}`, e2);
86
- }
87
- finally {
88
- try {
89
- unlinkSync(tmpDb);
90
- }
91
- catch { }
92
- }
93
- }
94
- }
95
- /**
96
- * Enumerate every Chrome `host_key` value that should match a request to `host`
97
- * per RFC 6265 §5.1.3. Chrome stores host-only cookies under the bare hostname
98
- * and domain cookies under `.parent.example.com`; a request to `www.example.com`
99
- * must see cookies at `www.example.com`, `.www.example.com`, and `.example.com`
100
- * but not anything scoped to a sibling (`.other.example.com`) or a TLD alone.
101
- */
102
- export function getMatchingHostKeys(host) {
103
- const normalized = host.toLowerCase().replace(/^\./, '');
104
- if (!normalized || !normalized.includes('.'))
105
- return [];
106
- const keys = [normalized, `.${normalized}`];
107
- let cur = normalized;
108
- while (true) {
109
- const idx = cur.indexOf('.');
110
- if (idx < 0)
111
- break;
112
- const parent = cur.substring(idx + 1);
113
- if (!parent.includes('.'))
114
- break;
115
- keys.push(`.${parent}`);
116
- cur = parent;
117
- }
118
- return keys;
119
- }
120
- function queryAllCookiesForHost(dbPath, host) {
121
- if (!existsSync(dbPath)) {
122
- throw new SyncError(SyncErrorCode.AUTH_CHROME_NOT_FOUND, `Chrome Cookies database not found at: ${dbPath}`);
123
- }
124
- const keys = getMatchingHostKeys(host);
125
- if (keys.length === 0)
126
- return { cookies: [], dbVersion: 0 };
127
- const quoted = keys.map(k => `'${k.replace(/'/g, "''")}'`).join(',');
128
- // Fetch cookies and DB version in one sqlite3 invocation to avoid double process spawn
129
- const sql = `SELECT name, host_key, path, hex(encrypted_value) as encrypted_value_hex, value, expires_utc, is_secure, is_httponly, (SELECT value FROM meta WHERE key='version') as db_version FROM cookies WHERE host_key IN (${quoted});`;
130
- const output = runSqliteQuery(dbPath, sql);
131
- if (!output || output === '[]')
132
- return { cookies: [], dbVersion: 0 };
133
- try {
134
- const rows = JSON.parse(output);
135
- const dbVersion = rows.length > 0 ? parseInt(rows[0]?.db_version ?? '0', 10) || 0 : 0;
136
- return { cookies: rows, dbVersion };
137
- }
138
- catch {
139
- return { cookies: [], dbVersion: 0 };
140
- }
141
- }
142
- const CHROMIUM_EPOCH_DELTA = 11644473600;
143
- function chromiumExpiresToUnix(expiresUtc) {
144
- const raw = typeof expiresUtc === 'string' ? parseInt(expiresUtc, 10) : expiresUtc;
145
- if (!raw || raw === 0)
146
- return null;
147
- return raw / 1_000_000 - CHROMIUM_EPOCH_DELTA;
148
- }
149
- function domainFromUrl(url) {
150
- try {
151
- return new URL(url).hostname;
152
- }
153
- catch {
154
- return url;
155
- }
156
- }
157
- export function makeChromeCookiesCapability() {
158
- return {
159
- async get(query) {
160
- if (query.browser !== 'chrome') {
161
- throw new SyncError(SyncErrorCode.AUTH_CHROME_NOT_FOUND, `Unsupported browser: ${query.browser}. Only 'chrome' is supported.`);
162
- }
163
- const os = platform();
164
- if (os !== 'darwin') {
165
- throw new SyncError(SyncErrorCode.AUTH_CHROME_NOT_FOUND, `Direct cookie extraction is currently supported on macOS only (detected: ${os}).`);
166
- }
167
- const profile = query.profile ?? 'Default';
168
- const dataDir = detectChromeUserDataDir();
169
- const dbPath = join(dataDir, profile, 'Cookies');
170
- const key = getMacOSChromeKey();
171
- const host = domainFromUrl(query.url);
172
- const result = queryAllCookiesForHost(dbPath, host);
173
- const cookies = [];
174
- for (const raw of result.cookies) {
175
- let value;
176
- const hexVal = raw.encrypted_value_hex;
177
- if (hexVal && hexVal.length > 0) {
178
- const buf = Buffer.from(hexVal, 'hex');
179
- const decrypted = decryptCookieValue(buf, key, result.dbVersion);
180
- value = decrypted.replace(/\0+$/g, '').trim();
181
- }
182
- else {
183
- value = raw.value ?? '';
184
- }
185
- cookies.push({
186
- name: raw.name,
187
- value,
188
- domain: raw.host_key,
189
- path: raw.path || '/',
190
- expires: chromiumExpiresToUnix(raw.expires_utc),
191
- secure: raw.is_secure === '1' || raw.is_secure === 'true',
192
- httpOnly: raw.is_httponly === '1' || raw.is_httponly === 'true',
193
- });
194
- }
195
- return cookies;
196
- },
197
- };
198
- }
199
- //# sourceMappingURL=cookies-chrome.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cookies-chrome.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/cookies-chrome.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { ExecCapability } from '@spool-lab/connector-sdk';
2
- export declare function makeExecCapability(): ExecCapability;
3
- //# sourceMappingURL=exec-impl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-impl.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/exec-impl.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,0BAA0B,CAAA;AAoC1E,wBAAgB,kBAAkB,IAAI,cAAc,CA6EnD"}