@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.
- package/LICENSE +11 -0
- package/README.md +8 -5
- 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/connectors/capabilities/cookies-chrome.d.ts +0 -19
- package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
- package/dist/connectors/capabilities/cookies-chrome.js +0 -199
- package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
- package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
- package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/exec-impl.js +0 -108
- package/dist/connectors/capabilities/exec-impl.js.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
- package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.js +0 -4
- package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
- package/dist/connectors/capabilities/index.d.ts +0 -6
- package/dist/connectors/capabilities/index.d.ts.map +0 -1
- package/dist/connectors/capabilities/index.js +0 -6
- package/dist/connectors/capabilities/index.js.map +0 -1
- package/dist/connectors/capabilities/log-impl.d.ts +0 -3
- package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/log-impl.js +0 -26
- package/dist/connectors/capabilities/log-impl.js.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
- package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.js +0 -19
- package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
- package/dist/connectors/loader.d.ts +0 -47
- package/dist/connectors/loader.d.ts.map +0 -1
- package/dist/connectors/loader.js +0 -328
- package/dist/connectors/loader.js.map +0 -1
- package/dist/connectors/npm-install.d.ts +0 -26
- package/dist/connectors/npm-install.d.ts.map +0 -1
- package/dist/connectors/npm-install.js +0 -71
- package/dist/connectors/npm-install.js.map +0 -1
- package/dist/connectors/prerequisites.d.ts +0 -14
- package/dist/connectors/prerequisites.d.ts.map +0 -1
- package/dist/connectors/prerequisites.js +0 -109
- package/dist/connectors/prerequisites.js.map +0 -1
- package/dist/connectors/registry-fetch.d.ts +0 -22
- package/dist/connectors/registry-fetch.d.ts.map +0 -1
- package/dist/connectors/registry-fetch.js +0 -54
- package/dist/connectors/registry-fetch.js.map +0 -1
- package/dist/connectors/registry.d.ts +0 -23
- package/dist/connectors/registry.d.ts.map +0 -1
- package/dist/connectors/registry.js +0 -59
- package/dist/connectors/registry.js.map +0 -1
- package/dist/connectors/sync-engine.d.ts +0 -30
- package/dist/connectors/sync-engine.d.ts.map +0 -1
- package/dist/connectors/sync-engine.js +0 -589
- package/dist/connectors/sync-engine.js.map +0 -1
- package/dist/connectors/sync-scheduler.d.ts +0 -56
- package/dist/connectors/sync-scheduler.d.ts.map +0 -1
- package/dist/connectors/sync-scheduler.js +0 -238
- package/dist/connectors/sync-scheduler.js.map +0 -1
- package/dist/connectors/trust-store.d.ts +0 -13
- package/dist/connectors/trust-store.d.ts.map +0 -1
- package/dist/connectors/trust-store.js +0 -48
- package/dist/connectors/trust-store.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -111
- package/dist/connectors/types.d.ts.map +0 -1
- package/dist/connectors/types.js +0 -50
- package/dist/connectors/types.js.map +0 -1
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { readdirSync } from 'node:fs';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
const DEFAULT_TIMEOUT = 60_000;
|
|
6
|
-
function buildEnrichedPath() {
|
|
7
|
-
const home = homedir();
|
|
8
|
-
const base = process.env['PATH'] ?? '';
|
|
9
|
-
const nvmBins = [];
|
|
10
|
-
const versionsDir = join(home, '.nvm', 'versions', 'node');
|
|
11
|
-
try {
|
|
12
|
-
for (const d of readdirSync(versionsDir)) {
|
|
13
|
-
if (d.startsWith('v'))
|
|
14
|
-
nvmBins.push(join(versionsDir, d, 'bin'));
|
|
15
|
-
}
|
|
16
|
-
nvmBins.sort().reverse();
|
|
17
|
-
}
|
|
18
|
-
catch { }
|
|
19
|
-
const extras = [
|
|
20
|
-
'/opt/homebrew/bin',
|
|
21
|
-
'/usr/local/bin',
|
|
22
|
-
`${home}/.local/bin`,
|
|
23
|
-
`${home}/.nvm/current/bin`,
|
|
24
|
-
`${home}/.fnm/aliases/default/bin`,
|
|
25
|
-
...nvmBins,
|
|
26
|
-
];
|
|
27
|
-
return [...extras, base].join(':');
|
|
28
|
-
}
|
|
29
|
-
/** POSIX single-quote escaping: wraps in '...' and escapes embedded single quotes. */
|
|
30
|
-
function shellQuote(s) {
|
|
31
|
-
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
32
|
-
}
|
|
33
|
-
let enrichedPath = null;
|
|
34
|
-
export function makeExecCapability() {
|
|
35
|
-
if (!enrichedPath)
|
|
36
|
-
enrichedPath = buildEnrichedPath();
|
|
37
|
-
const isWin = process.platform === 'win32';
|
|
38
|
-
return {
|
|
39
|
-
run(bin, args, opts) {
|
|
40
|
-
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;
|
|
41
|
-
return new Promise((resolve, reject) => {
|
|
42
|
-
// GUI-launched apps on macOS don't inherit the user's shell env (no
|
|
43
|
-
// proxy vars, no nvm PATH, etc.) — running through a login shell
|
|
44
|
-
// sources .zprofile / .bash_profile so subprocesses get a realistic
|
|
45
|
-
// env. zsh additionally needs -i to source .zshrc where most users
|
|
46
|
-
// keep proxy/PATH tweaks; bash -i emits "cannot set terminal process
|
|
47
|
-
// group" warnings in non-TTY contexts (eg. CI) so we stick to plain
|
|
48
|
-
// -lc for bash and rely on .bash_profile to source .bashrc as is
|
|
49
|
-
// standard. On Windows there is no equivalent concept, spawn direct.
|
|
50
|
-
const shellPath = process.env['SHELL'] || '/bin/zsh';
|
|
51
|
-
const useInteractive = /\bzsh$/.test(shellPath);
|
|
52
|
-
const proc = isWin
|
|
53
|
-
? spawn(bin, args, {
|
|
54
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
55
|
-
env: { ...process.env, PATH: enrichedPath },
|
|
56
|
-
})
|
|
57
|
-
: spawn(shellPath, [useInteractive ? '-ilc' : '-lc', [bin, ...args].map(shellQuote).join(' ')], {
|
|
58
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
59
|
-
env: { ...process.env, PATH: enrichedPath },
|
|
60
|
-
// Run in own process group so timeout kills the inner command
|
|
61
|
-
// too, not just the shell wrapper.
|
|
62
|
-
detached: true,
|
|
63
|
-
});
|
|
64
|
-
let stdout = '';
|
|
65
|
-
let stderr = '';
|
|
66
|
-
let timedOut = false;
|
|
67
|
-
const killGroup = () => {
|
|
68
|
-
if (!isWin && proc.pid) {
|
|
69
|
-
// Kill the whole process group so the shell wrapper AND the
|
|
70
|
-
// inner command both terminate. Without this, killing only the
|
|
71
|
-
// shell leaves the inner command orphaned and stdio pipes open.
|
|
72
|
-
try {
|
|
73
|
-
process.kill(-proc.pid, 'SIGKILL');
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
proc.kill('SIGKILL');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
proc.kill();
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
const timer = setTimeout(() => {
|
|
84
|
-
timedOut = true;
|
|
85
|
-
killGroup();
|
|
86
|
-
// Resolve immediately rather than waiting for stdio drain — the
|
|
87
|
-
// 'close' handler may not fire promptly when the process group is
|
|
88
|
-
// killed because orphaned descendants can keep pipes open.
|
|
89
|
-
reject(new Error(`Process timed out after ${timeout}ms`));
|
|
90
|
-
}, timeout);
|
|
91
|
-
proc.stdout.on('data', (d) => { stdout += d.toString(); });
|
|
92
|
-
proc.stderr.on('data', (d) => { stderr += d.toString(); });
|
|
93
|
-
proc.on('close', () => {
|
|
94
|
-
clearTimeout(timer);
|
|
95
|
-
if (!timedOut) {
|
|
96
|
-
resolve({ stdout, stderr, exitCode: proc.exitCode ?? 1 });
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
proc.on('error', (err) => {
|
|
100
|
-
clearTimeout(timer);
|
|
101
|
-
if (!timedOut)
|
|
102
|
-
reject(err);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=exec-impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exec-impl.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/exec-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-impl.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/fetch-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,GAClD,eAAe,CAEjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-impl.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/fetch-impl.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,UAAmC,UAAU,CAAC,KAAK;IAEnD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { makeFetchCapability } from './fetch-impl.js';
|
|
2
|
-
export { makeChromeCookiesCapability } from './cookies-chrome.js';
|
|
3
|
-
export { makeLogCapabilityFor } from './log-impl.js';
|
|
4
|
-
export { makeSqliteCapability } from './sqlite-impl.js';
|
|
5
|
-
export { makeExecCapability } from './exec-impl.js';
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { makeFetchCapability } from './fetch-impl.js';
|
|
2
|
-
export { makeChromeCookiesCapability } from './cookies-chrome.js';
|
|
3
|
-
export { makeLogCapabilityFor } from './log-impl.js';
|
|
4
|
-
export { makeSqliteCapability } from './sqlite-impl.js';
|
|
5
|
-
export { makeExecCapability } from './exec-impl.js';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-impl.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/log-impl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,0BAA0B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAuCvE"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Effect } from 'effect';
|
|
2
|
-
export function makeLogCapabilityFor(connectorId) {
|
|
3
|
-
const baseAttrs = { 'connector.id': connectorId };
|
|
4
|
-
const emit = (level, msg, fields) => {
|
|
5
|
-
const attrs = { ...baseAttrs, ...fields };
|
|
6
|
-
const effect = level === 'Debug' ? Effect.logDebug(msg) :
|
|
7
|
-
level === 'Info' ? Effect.logInfo(msg) :
|
|
8
|
-
level === 'Warning' ? Effect.logWarning(msg) :
|
|
9
|
-
Effect.logError(msg);
|
|
10
|
-
Effect.runFork(effect.pipe(Effect.annotateLogs(attrs)));
|
|
11
|
-
};
|
|
12
|
-
return {
|
|
13
|
-
debug(msg, fields) { emit('Debug', msg, fields); },
|
|
14
|
-
info(msg, fields) { emit('Info', msg, fields); },
|
|
15
|
-
warn(msg, fields) { emit('Warning', msg, fields); },
|
|
16
|
-
error(msg, fields) { emit('Error', msg, fields); },
|
|
17
|
-
async span(name, fn, opts) {
|
|
18
|
-
const attrs = { ...baseAttrs, ...opts?.attributes };
|
|
19
|
-
return Effect.runPromise(Effect.tryPromise({
|
|
20
|
-
try: fn,
|
|
21
|
-
catch: e => e,
|
|
22
|
-
}).pipe(Effect.withSpan(`connector.${name}`, { attributes: attrs })));
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=log-impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-impl.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/log-impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,SAAS,GAAc,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA;IAE5D,MAAM,IAAI,GAAG,CACX,KAA6C,EAC7C,GAAW,EACX,MAAkB,EAClB,EAAE;QACF,MAAM,KAAK,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,CAAA;QACzC,MAAM,MAAM,GACV,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC,CAAA;IAED,OAAO;QACL,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAClD,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAEjD,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,EAAoB,EACpB,IAAiC;YAEjC,MAAM,KAAK,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAA;YACnD,OAAO,MAAM,CAAC,UAAU,CACtB,MAAM,CAAC,UAAU,CAAC;gBAChB,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;aACd,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAC5D,CACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-impl.d.ts","sourceRoot":"","sources":["../../../src/connectors/capabilities/sqlite-impl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAmC,MAAM,0BAA0B,CAAA;AAEjG,wBAAgB,oBAAoB,IAAI,gBAAgB,CAgBvD"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
export function makeSqliteCapability() {
|
|
3
|
-
return {
|
|
4
|
-
openReadonly(path) {
|
|
5
|
-
const db = new Database(path, { readonly: true, fileMustExist: true });
|
|
6
|
-
return {
|
|
7
|
-
prepare(sql) {
|
|
8
|
-
const stmt = db.prepare(sql);
|
|
9
|
-
return {
|
|
10
|
-
all: (...params) => stmt.all(...params),
|
|
11
|
-
get: (...params) => stmt.get(...params),
|
|
12
|
-
};
|
|
13
|
-
},
|
|
14
|
-
close: () => { db.close(); },
|
|
15
|
-
};
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=sqlite-impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-impl.js","sourceRoot":"","sources":["../../../src/connectors/capabilities/sqlite-impl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAGrC,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,YAAY,CAAC,IAAY;YACvB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YACtE,OAAO;gBACL,OAAO,CAAc,GAAW;oBAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAC5B,OAAO;wBACL,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAQ;wBAC9C,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB;qBACzD,CAAA;gBACH,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC;aAC5B,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { CookiesCapability, ExecCapability, FetchCapability, LogCapability, Prerequisite, PrerequisitesCapability, SqliteCapability } from '@spool-lab/connector-sdk';
|
|
2
|
-
import type { ConnectorRegistry } from './registry.js';
|
|
3
|
-
interface BaseLogger {
|
|
4
|
-
info(msg: string, fields?: Record<string, unknown>): void;
|
|
5
|
-
warn(msg: string, fields?: Record<string, unknown>): void;
|
|
6
|
-
error(msg: string, fields?: Record<string, unknown>): void;
|
|
7
|
-
}
|
|
8
|
-
import { TrustStore } from './trust-store.js';
|
|
9
|
-
export declare function validatePrerequisites(prereqs: unknown[], packageName: string): Prerequisite[];
|
|
10
|
-
export interface CapabilityImpls {
|
|
11
|
-
fetch: FetchCapability;
|
|
12
|
-
cookies: CookiesCapability;
|
|
13
|
-
sqlite: SqliteCapability;
|
|
14
|
-
exec: ExecCapability;
|
|
15
|
-
logFor(connectorId: string): LogCapability;
|
|
16
|
-
/** Returns the prerequisites capability for the given package id, or undefined if not supported. */
|
|
17
|
-
prerequisitesFor?: (packageId: string) => PrerequisitesCapability;
|
|
18
|
-
}
|
|
19
|
-
export interface LoaderLogger extends BaseLogger {
|
|
20
|
-
child?(attrs: Record<string, unknown>): LoaderLogger;
|
|
21
|
-
}
|
|
22
|
-
export interface LoadDeps {
|
|
23
|
-
connectorsDir: string;
|
|
24
|
-
capabilityImpls: CapabilityImpls;
|
|
25
|
-
registry: ConnectorRegistry;
|
|
26
|
-
log: LoaderLogger;
|
|
27
|
-
trustStore: TrustStore;
|
|
28
|
-
}
|
|
29
|
-
export type LoadResult = {
|
|
30
|
-
status: 'loaded';
|
|
31
|
-
name: string;
|
|
32
|
-
version: string;
|
|
33
|
-
} | {
|
|
34
|
-
status: 'failed';
|
|
35
|
-
name: string;
|
|
36
|
-
error: unknown;
|
|
37
|
-
} | {
|
|
38
|
-
status: 'skipped';
|
|
39
|
-
name: string;
|
|
40
|
-
reason: 'not-in-allowlist' | 'bad-manifest';
|
|
41
|
-
};
|
|
42
|
-
export interface LoadReport {
|
|
43
|
-
loadResults: LoadResult[];
|
|
44
|
-
}
|
|
45
|
-
export declare function loadConnectors(deps: LoadDeps): Promise<LoadReport>;
|
|
46
|
-
export {};
|
|
47
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/connectors/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,UAAU,UAAU;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC3D;AACD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CAgC7F;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAA;IACtB,OAAO,EAAE,iBAAiB,CAAA;IAC1B,MAAM,EAAE,gBAAgB,CAAA;IACxB,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAAA;IAC1C,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,uBAAuB,CAAA;CAClE;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAAA;CACrD;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,GAAG,EAAE,YAAY,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAA;CAAE,CAAA;AAEpF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAwBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAexE"}
|
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { pathToFileURL } from 'node:url';
|
|
4
|
-
import { SyncError, SyncErrorCode, KNOWN_CAPABILITIES_V1 } from '@spool-lab/connector-sdk';
|
|
5
|
-
export function validatePrerequisites(prereqs, packageName) {
|
|
6
|
-
const result = [];
|
|
7
|
-
const seen = new Set();
|
|
8
|
-
for (const raw of prereqs) {
|
|
9
|
-
const p = raw;
|
|
10
|
-
if (!p.id || !p.name || !p.kind || !p.detect || !p.install) {
|
|
11
|
-
throw new Error(`Invalid prerequisite in ${packageName}: missing required fields`);
|
|
12
|
-
}
|
|
13
|
-
if (p.install.kind !== p.kind) {
|
|
14
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: install.kind "${p.install.kind}" must match kind "${p.kind}"`);
|
|
15
|
-
}
|
|
16
|
-
if (p.kind === 'browser-extension') {
|
|
17
|
-
const inst = p.install;
|
|
18
|
-
if (!inst.webstoreUrl && !inst.manual) {
|
|
19
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: browser-extension requires webstoreUrl or manual`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
if (p.minVersion && !(p.detect.type === 'exec' && p.detect.versionRegex)) {
|
|
23
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: minVersion requires detect.versionRegex`);
|
|
24
|
-
}
|
|
25
|
-
if (seen.has(p.id)) {
|
|
26
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: duplicate id`);
|
|
27
|
-
}
|
|
28
|
-
for (const req of p.requires ?? []) {
|
|
29
|
-
if (!seen.has(req)) {
|
|
30
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: requires "${req}" must appear earlier in array`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
seen.add(p.id);
|
|
34
|
-
result.push(p);
|
|
35
|
-
}
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
const KNOWN_CAPS_SET = new Set(KNOWN_CAPABILITIES_V1);
|
|
39
|
-
const importedModules = new Map();
|
|
40
|
-
export async function loadConnectors(deps) {
|
|
41
|
-
const { connectorsDir, log } = deps;
|
|
42
|
-
importedModules.clear();
|
|
43
|
-
deps.registry.clear();
|
|
44
|
-
const discovered = discoverConnectorPackages(connectorsDir, log);
|
|
45
|
-
const loadResults = [];
|
|
46
|
-
for (const pkg of discovered) {
|
|
47
|
-
const result = await loadOneConnector(pkg, deps);
|
|
48
|
-
loadResults.push(result);
|
|
49
|
-
}
|
|
50
|
-
return { loadResults };
|
|
51
|
-
}
|
|
52
|
-
function discoverConnectorPackages(connectorsDir, log) {
|
|
53
|
-
const nodeModules = join(connectorsDir, 'node_modules');
|
|
54
|
-
if (!existsSync(nodeModules))
|
|
55
|
-
return [];
|
|
56
|
-
const results = [];
|
|
57
|
-
let topEntries;
|
|
58
|
-
try {
|
|
59
|
-
topEntries = readdirSync(nodeModules);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
log.error('failed to read node_modules', { error: String(err) });
|
|
63
|
-
return results;
|
|
64
|
-
}
|
|
65
|
-
for (const entry of topEntries) {
|
|
66
|
-
if (entry.startsWith('.'))
|
|
67
|
-
continue;
|
|
68
|
-
const entryPath = join(nodeModules, entry);
|
|
69
|
-
if (entry.startsWith('@')) {
|
|
70
|
-
let scopedEntries;
|
|
71
|
-
try {
|
|
72
|
-
scopedEntries = readdirSync(entryPath);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
for (const sub of scopedEntries) {
|
|
78
|
-
if (sub.startsWith('.'))
|
|
79
|
-
continue;
|
|
80
|
-
results.push(...tryReadConnectorManifest(join(entryPath, sub), log));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
results.push(...tryReadConnectorManifest(entryPath, log));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return results;
|
|
88
|
-
}
|
|
89
|
-
function tryReadConnectorManifest(pkgDir, log) {
|
|
90
|
-
const pkgJsonPath = join(pkgDir, 'package.json');
|
|
91
|
-
if (!existsSync(pkgJsonPath))
|
|
92
|
-
return [];
|
|
93
|
-
let json;
|
|
94
|
-
try {
|
|
95
|
-
json = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
log.warn('invalid package.json', { path: pkgJsonPath, error: String(err) });
|
|
99
|
-
return [];
|
|
100
|
-
}
|
|
101
|
-
if (json?.spool?.type !== 'connector')
|
|
102
|
-
return [];
|
|
103
|
-
const packageName = String(json.name);
|
|
104
|
-
let prerequisites;
|
|
105
|
-
try {
|
|
106
|
-
prerequisites = validatePrerequisites(Array.isArray(json.spool.prerequisites) ? json.spool.prerequisites : [], packageName);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
log.error('invalid prerequisites in package', { package: packageName, error: String(err) });
|
|
110
|
-
return [];
|
|
111
|
-
}
|
|
112
|
-
// Multi-connector package: spool.connectors is an array
|
|
113
|
-
if (Array.isArray(json.spool.connectors)) {
|
|
114
|
-
const results = [];
|
|
115
|
-
for (const entry of json.spool.connectors) {
|
|
116
|
-
const declared = Array.isArray(entry.capabilities) ? entry.capabilities : [];
|
|
117
|
-
const unknown = declared.filter(c => !KNOWN_CAPS_SET.has(c));
|
|
118
|
-
if (unknown.length > 0) {
|
|
119
|
-
log.error('unknown capability in spool.connectors entry', {
|
|
120
|
-
package: packageName,
|
|
121
|
-
connectorId: entry.id,
|
|
122
|
-
unknown,
|
|
123
|
-
error: `Unknown capability "${unknown[0]}" — known v1 values: ${[...KNOWN_CAPS_SET].join(', ')}`,
|
|
124
|
-
});
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
results.push({
|
|
128
|
-
dir: pkgDir,
|
|
129
|
-
name: packageName,
|
|
130
|
-
version: String(json.version ?? '0.0.0'),
|
|
131
|
-
manifest: {
|
|
132
|
-
id: String(entry.id ?? ''),
|
|
133
|
-
platform: String(entry.platform ?? ''),
|
|
134
|
-
label: String(entry.label ?? ''),
|
|
135
|
-
description: String(entry.description ?? ''),
|
|
136
|
-
color: String(entry.color ?? '#888'),
|
|
137
|
-
ephemeral: Boolean(entry.ephemeral),
|
|
138
|
-
capabilities: declared,
|
|
139
|
-
},
|
|
140
|
-
main: String(json.main ?? 'dist/index.js'),
|
|
141
|
-
multi: true,
|
|
142
|
-
prerequisites,
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return results;
|
|
146
|
-
}
|
|
147
|
-
// Single-connector package (original path)
|
|
148
|
-
const declared = Array.isArray(json.spool.capabilities)
|
|
149
|
-
? json.spool.capabilities
|
|
150
|
-
: [];
|
|
151
|
-
const unknown = declared.filter(c => !KNOWN_CAPS_SET.has(c));
|
|
152
|
-
if (unknown.length > 0) {
|
|
153
|
-
log.error('unknown capability in spool.capabilities', {
|
|
154
|
-
package: packageName,
|
|
155
|
-
unknown,
|
|
156
|
-
error: `Unknown capability "${unknown[0]}" — known v1 values: ${[...KNOWN_CAPS_SET].join(', ')}`,
|
|
157
|
-
});
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
160
|
-
return [{
|
|
161
|
-
dir: pkgDir,
|
|
162
|
-
name: packageName,
|
|
163
|
-
version: String(json.version ?? '0.0.0'),
|
|
164
|
-
manifest: {
|
|
165
|
-
id: String(json.spool.id ?? ''),
|
|
166
|
-
platform: String(json.spool.platform ?? ''),
|
|
167
|
-
label: String(json.spool.label ?? ''),
|
|
168
|
-
description: String(json.spool.description ?? ''),
|
|
169
|
-
color: String(json.spool.color ?? '#888'),
|
|
170
|
-
ephemeral: Boolean(json.spool.ephemeral),
|
|
171
|
-
capabilities: declared,
|
|
172
|
-
},
|
|
173
|
-
main: String(json.main ?? 'dist/index.js'),
|
|
174
|
-
multi: false,
|
|
175
|
-
prerequisites,
|
|
176
|
-
}];
|
|
177
|
-
}
|
|
178
|
-
async function loadOneConnector(pkg, deps) {
|
|
179
|
-
if (!deps.trustStore.isTrusted(pkg.name)) {
|
|
180
|
-
deps.log.info('skip untrusted connector', { name: pkg.name, id: pkg.manifest.id });
|
|
181
|
-
return { status: 'skipped', name: pkg.name, reason: 'not-in-allowlist' };
|
|
182
|
-
}
|
|
183
|
-
try {
|
|
184
|
-
const entryPath = join(pkg.dir, pkg.main);
|
|
185
|
-
if (!existsSync(entryPath)) {
|
|
186
|
-
throw new Error(`entry file not found: ${entryPath}`);
|
|
187
|
-
}
|
|
188
|
-
let mod;
|
|
189
|
-
if (importedModules.has(entryPath)) {
|
|
190
|
-
mod = importedModules.get(entryPath);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
const modUrl = pathToFileURL(entryPath).href;
|
|
194
|
-
mod = await import(modUrl);
|
|
195
|
-
importedModules.set(entryPath, mod);
|
|
196
|
-
}
|
|
197
|
-
const caps = buildCapabilities(pkg.manifest.capabilities, pkg.manifest.id, pkg.name, deps.capabilityImpls);
|
|
198
|
-
let ConnectorClass;
|
|
199
|
-
if (pkg.multi) {
|
|
200
|
-
// Multi-connector: find the class from mod.connectors by matching id
|
|
201
|
-
const classes = mod.connectors;
|
|
202
|
-
if (!Array.isArray(classes)) {
|
|
203
|
-
throw new Error('multi-connector package must export a `connectors` array');
|
|
204
|
-
}
|
|
205
|
-
ConnectorClass = null;
|
|
206
|
-
for (const Cls of classes) {
|
|
207
|
-
if (typeof Cls !== 'function')
|
|
208
|
-
continue;
|
|
209
|
-
const probe = new Cls(caps);
|
|
210
|
-
if (probe.id === pkg.manifest.id) {
|
|
211
|
-
ConnectorClass = Cls;
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
if (!ConnectorClass) {
|
|
216
|
-
throw new Error(`no connector class with id="${pkg.manifest.id}" found in connectors array`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
ConnectorClass =
|
|
221
|
-
mod.default ??
|
|
222
|
-
mod[pkg.manifest.id] ??
|
|
223
|
-
(typeof mod === 'function' ? mod : null);
|
|
224
|
-
}
|
|
225
|
-
if (typeof ConnectorClass !== 'function') {
|
|
226
|
-
throw new Error('module does not export a connector class');
|
|
227
|
-
}
|
|
228
|
-
const instance = new ConnectorClass(caps);
|
|
229
|
-
applyManifestMetadata(instance, pkg, deps.log);
|
|
230
|
-
deps.registry.register(instance);
|
|
231
|
-
const connectorPkg = {
|
|
232
|
-
id: pkg.name,
|
|
233
|
-
packageName: pkg.name,
|
|
234
|
-
rootDir: pkg.dir,
|
|
235
|
-
connectors: [instance],
|
|
236
|
-
};
|
|
237
|
-
if (pkg.prerequisites.length > 0) {
|
|
238
|
-
connectorPkg.prerequisites = pkg.prerequisites;
|
|
239
|
-
}
|
|
240
|
-
deps.registry.registerPackage(connectorPkg);
|
|
241
|
-
deps.log.info('loaded connector', { name: pkg.name, id: pkg.manifest.id, version: pkg.version });
|
|
242
|
-
return { status: 'loaded', name: pkg.name, version: pkg.version };
|
|
243
|
-
}
|
|
244
|
-
catch (err) {
|
|
245
|
-
deps.log.error('failed to load connector', {
|
|
246
|
-
name: pkg.name,
|
|
247
|
-
id: pkg.manifest.id,
|
|
248
|
-
error: err instanceof Error ? err.message : String(err),
|
|
249
|
-
stack: err instanceof Error ? err.stack : undefined,
|
|
250
|
-
});
|
|
251
|
-
return { status: 'failed', name: pkg.name, error: err };
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
function buildCapabilities(declared, connectorId, packageId, impls) {
|
|
255
|
-
const caps = {
|
|
256
|
-
fetch: declared.includes('fetch')
|
|
257
|
-
? impls.fetch
|
|
258
|
-
: undefinedCapability('fetch'),
|
|
259
|
-
cookies: declared.includes('cookies:chrome')
|
|
260
|
-
? impls.cookies
|
|
261
|
-
: undefinedCapability('cookies:chrome'),
|
|
262
|
-
log: declared.includes('log')
|
|
263
|
-
? impls.logFor(connectorId)
|
|
264
|
-
: undefinedCapability('log'),
|
|
265
|
-
sqlite: declared.includes('sqlite')
|
|
266
|
-
? impls.sqlite
|
|
267
|
-
: undefinedCapability('sqlite'),
|
|
268
|
-
exec: declared.includes('exec')
|
|
269
|
-
? impls.exec
|
|
270
|
-
: undefinedCapability('exec'),
|
|
271
|
-
};
|
|
272
|
-
if (declared.includes('prerequisites') && impls.prerequisitesFor) {
|
|
273
|
-
caps.prerequisites = impls.prerequisitesFor(packageId);
|
|
274
|
-
}
|
|
275
|
-
return caps;
|
|
276
|
-
}
|
|
277
|
-
function undefinedCapability(name) {
|
|
278
|
-
return new Proxy(function undef() {
|
|
279
|
-
throw makeUndeclaredError(name, 'call');
|
|
280
|
-
}, {
|
|
281
|
-
get(_target, prop) {
|
|
282
|
-
return () => {
|
|
283
|
-
throw makeUndeclaredError(name, String(prop));
|
|
284
|
-
};
|
|
285
|
-
},
|
|
286
|
-
apply() {
|
|
287
|
-
throw makeUndeclaredError(name, 'call');
|
|
288
|
-
},
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
function makeUndeclaredError(name, accessor) {
|
|
292
|
-
return new SyncError(SyncErrorCode.CONNECTOR_ERROR, `Capability "${name}" used (via .${accessor}) but not declared in spool.capabilities`);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Manifest is the single source of truth for connector metadata.
|
|
296
|
-
*
|
|
297
|
-
* Any `readonly id/platform/label/description/color/ephemeral` declared on the
|
|
298
|
-
* connector class is treated as a default and overwritten with the manifest
|
|
299
|
-
* value so that runtime behavior always matches what the package declared.
|
|
300
|
-
*
|
|
301
|
-
* If the class field disagrees with the manifest, we log a warning so authors
|
|
302
|
-
* can clean it up — but loading proceeds, since silently dropping a connector
|
|
303
|
-
* because two redundant declarations drifted is worse than the inconsistency.
|
|
304
|
-
*/
|
|
305
|
-
function applyManifestMetadata(instance, pkg, log) {
|
|
306
|
-
const fields = [
|
|
307
|
-
'id', 'platform', 'label', 'description', 'color', 'ephemeral',
|
|
308
|
-
];
|
|
309
|
-
for (const field of fields) {
|
|
310
|
-
const classValue = instance[field];
|
|
311
|
-
const manifestValue = pkg.manifest[field];
|
|
312
|
-
if (classValue !== undefined && classValue !== manifestValue) {
|
|
313
|
-
log.warn('connector class field disagrees with manifest; manifest wins', {
|
|
314
|
-
package: pkg.name,
|
|
315
|
-
field,
|
|
316
|
-
classValue,
|
|
317
|
-
manifestValue,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
Object.defineProperty(instance, field, {
|
|
321
|
-
value: manifestValue,
|
|
322
|
-
writable: false,
|
|
323
|
-
configurable: true,
|
|
324
|
-
enumerable: true,
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/connectors/loader.ts"],"names":[],"mappings":"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"}
|