@opendatalabs/connect 0.8.1 → 0.9.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/README.md +58 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +15 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +89 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +3844 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +10 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +15 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +199 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/queries.d.ts +128 -0
- package/dist/cli/queries.d.ts.map +1 -0
- package/dist/cli/queries.js +415 -0
- package/dist/cli/queries.js.map +1 -0
- package/dist/cli/render/capabilities.d.ts +9 -0
- package/dist/cli/render/capabilities.d.ts.map +1 -0
- package/dist/cli/render/capabilities.js +24 -0
- package/dist/cli/render/capabilities.js.map +1 -0
- package/dist/cli/render/connect-renderer.d.ts +18 -0
- package/dist/cli/render/connect-renderer.d.ts.map +1 -0
- package/dist/cli/render/connect-renderer.js +255 -0
- package/dist/cli/render/connect-renderer.js.map +1 -0
- package/dist/cli/render/format.d.ts +27 -0
- package/dist/cli/render/format.d.ts.map +1 -0
- package/dist/cli/render/format.js +111 -0
- package/dist/cli/render/format.js.map +1 -0
- package/dist/cli/render/index.d.ts +7 -0
- package/dist/cli/render/index.d.ts.map +1 -0
- package/dist/cli/render/index.js +7 -0
- package/dist/cli/render/index.js.map +1 -0
- package/dist/cli/render/progress.d.ts +11 -0
- package/dist/cli/render/progress.d.ts.map +1 -0
- package/dist/cli/render/progress.js +56 -0
- package/dist/cli/render/progress.js.map +1 -0
- package/dist/cli/render/symbols.d.ts +11 -0
- package/dist/cli/render/symbols.d.ts.map +1 -0
- package/dist/cli/render/symbols.js +21 -0
- package/dist/cli/render/symbols.js.map +1 -0
- package/dist/cli/render/theme.d.ts +15 -0
- package/dist/cli/render/theme.d.ts.map +1 -0
- package/dist/cli/render/theme.js +41 -0
- package/dist/cli/render/theme.js.map +1 -0
- package/dist/cli/search-select.d.ts +17 -0
- package/dist/cli/search-select.d.ts.map +1 -0
- package/dist/cli/search-select.js +29 -0
- package/dist/cli/search-select.js.map +1 -0
- package/dist/cli/update-check-worker.d.ts +2 -0
- package/dist/cli/update-check-worker.d.ts.map +1 -0
- package/dist/cli/update-check-worker.js +55 -0
- package/dist/cli/update-check-worker.js.map +1 -0
- package/dist/cli/update-check.d.ts +21 -0
- package/dist/cli/update-check.d.ts.map +1 -0
- package/dist/cli/update-check.js +52 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/connectors/index.d.ts +2 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +2 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/registry.d.ts +55 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +298 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/core/cli-types.d.ts +692 -0
- package/dist/core/cli-types.d.ts.map +1 -0
- package/dist/core/cli-types.js +322 -0
- package/dist/core/cli-types.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/paths.d.ts +28 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +89 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/state-store.d.ts +39 -0
- package/dist/core/state-store.d.ts.map +1 -0
- package/dist/core/state-store.js +101 -0
- package/dist/core/state-store.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/personal-server/client.d.ts +34 -0
- package/dist/personal-server/client.d.ts.map +1 -0
- package/dist/personal-server/client.js +94 -0
- package/dist/personal-server/client.js.map +1 -0
- package/dist/personal-server/index.d.ts +18 -0
- package/dist/personal-server/index.d.ts.map +1 -0
- package/dist/personal-server/index.js +123 -0
- package/dist/personal-server/index.js.map +1 -0
- package/dist/personal-server/scope-resolver.d.ts +22 -0
- package/dist/personal-server/scope-resolver.d.ts.map +1 -0
- package/dist/personal-server/scope-resolver.js +68 -0
- package/dist/personal-server/scope-resolver.js.map +1 -0
- package/dist/runtime/core/contracts.d.ts +84 -0
- package/dist/runtime/core/contracts.d.ts.map +1 -0
- package/dist/runtime/core/contracts.js +2 -0
- package/dist/runtime/core/contracts.js.map +1 -0
- package/dist/runtime/core/index.d.ts +2 -0
- package/dist/runtime/core/index.d.ts.map +1 -0
- package/dist/runtime/core/index.js +2 -0
- package/dist/runtime/core/index.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/managed-playwright.d.ts +42 -0
- package/dist/runtime/managed-playwright.d.ts.map +1 -0
- package/dist/runtime/managed-playwright.js +178 -0
- package/dist/runtime/managed-playwright.js.map +1 -0
- package/dist/runtime/playwright/browser.d.ts +12 -0
- package/dist/runtime/playwright/browser.d.ts.map +1 -0
- package/dist/runtime/playwright/browser.js +229 -0
- package/dist/runtime/playwright/browser.js.map +1 -0
- package/dist/runtime/playwright/in-process-run.d.ts +6 -0
- package/dist/runtime/playwright/in-process-run.d.ts.map +1 -0
- package/dist/runtime/playwright/in-process-run.js +628 -0
- package/dist/runtime/playwright/in-process-run.js.map +1 -0
- package/dist/runtime/playwright/index.d.ts +3 -0
- package/dist/runtime/playwright/index.d.ts.map +1 -0
- package/dist/runtime/playwright/index.js +3 -0
- package/dist/runtime/playwright/index.js.map +1 -0
- package/dist/runtime/repo-paths.d.ts +2 -0
- package/dist/runtime/repo-paths.d.ts.map +1 -0
- package/dist/runtime/repo-paths.js +36 -0
- package/dist/runtime/repo-paths.js.map +1 -0
- package/dist/server/config.d.ts +2 -0
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +1 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/connect.d.ts.map +1 -1
- package/dist/server/connect.js +4 -0
- package/dist/server/connect.js.map +1 -1
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/paths.d.ts +33 -0
- package/dist/skills/paths.d.ts.map +1 -0
- package/dist/skills/paths.js +81 -0
- package/dist/skills/paths.js.map +1 -0
- package/dist/skills/registry.d.ts +48 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +173 -0
- package/dist/skills/registry.js.map +1 -0
- package/package.json +51 -4
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface SearchSelectChoice<T> {
|
|
2
|
+
value: T;
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
interface SearchSelectOptions<T> {
|
|
7
|
+
message: string;
|
|
8
|
+
choices: SearchSelectChoice<T>[];
|
|
9
|
+
theme?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Fuzzy search select prompt. Type to filter, arrow keys to navigate.
|
|
13
|
+
* Uses fuse.js for fuzzy matching over the choice name and description.
|
|
14
|
+
*/
|
|
15
|
+
export declare function searchSelect<T>(options: SearchSelectOptions<T>): Promise<T>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=search-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-select.d.ts","sourceRoot":"","sources":["../../src/cli/search-select.ts"],"names":[],"mappings":"AAGA,UAAU,kBAAkB,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,mBAAmB,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import search from "@inquirer/search";
|
|
2
|
+
import Fuse from "fuse.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fuzzy search select prompt. Type to filter, arrow keys to navigate.
|
|
5
|
+
* Uses fuse.js for fuzzy matching over the choice name and description.
|
|
6
|
+
*/
|
|
7
|
+
export async function searchSelect(options) {
|
|
8
|
+
const { message, choices, theme } = options;
|
|
9
|
+
const fuse = new Fuse(choices, {
|
|
10
|
+
keys: [
|
|
11
|
+
{ name: "name", weight: 2 },
|
|
12
|
+
{ name: "description", weight: 1 },
|
|
13
|
+
],
|
|
14
|
+
threshold: 0.4,
|
|
15
|
+
ignoreLocation: true,
|
|
16
|
+
});
|
|
17
|
+
const result = await search({
|
|
18
|
+
message,
|
|
19
|
+
source: async (input) => {
|
|
20
|
+
if (!input)
|
|
21
|
+
return choices;
|
|
22
|
+
const results = fuse.search(input);
|
|
23
|
+
return results.map((r) => r.item);
|
|
24
|
+
},
|
|
25
|
+
theme: theme,
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=search-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-select.js","sourceRoot":"","sources":["../../src/cli/search-select.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,IAAI,MAAM,SAAS,CAAC;AAc3B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;QAC7B,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;YAC3B,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;SACnC;QACD,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO;QACP,MAAM,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE;YAC1C,IAAI,CAAC,KAAK;gBAAE,OAAO,OAAO,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,EAAE,KAA8C;KACtD,CAAC,CAAC;IAEH,OAAO,MAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check-worker.d.ts","sourceRoot":"","sources":["../../src/cli/update-check-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone worker script: checks for the latest CLI version and writes
|
|
3
|
+
* the result to a cache file. Runs as a detached child process spawned by
|
|
4
|
+
* the main CLI — exits silently on any failure.
|
|
5
|
+
*
|
|
6
|
+
* argv: [node, script, currentVersion, installMethod, outputPath]
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
const [, , currentVersion, installMethod, outputPath] = process.argv;
|
|
11
|
+
async function main() {
|
|
12
|
+
if (!currentVersion || !installMethod || !outputPath) {
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
let latestVersion = null;
|
|
16
|
+
switch (installMethod) {
|
|
17
|
+
case "homebrew": {
|
|
18
|
+
const res = await fetch("https://formulae.brew.sh/api/formula/vana.json", { signal: AbortSignal.timeout(10_000) });
|
|
19
|
+
if (res.ok) {
|
|
20
|
+
const data = (await res.json());
|
|
21
|
+
latestVersion = data.versions?.stable ?? null;
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case "installer": {
|
|
26
|
+
const res = await fetch("https://api.github.com/repos/vana-com/vana-connect/releases/latest", {
|
|
27
|
+
headers: { "User-Agent": "@opendatalabs/connect" },
|
|
28
|
+
signal: AbortSignal.timeout(10_000),
|
|
29
|
+
});
|
|
30
|
+
if (res.ok) {
|
|
31
|
+
const data = (await res.json());
|
|
32
|
+
latestVersion = data.tag_name?.replace(/^v/, "") ?? null;
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
default: {
|
|
37
|
+
const res = await fetch("https://registry.npmjs.org/@opendatalabs/connect/latest", { signal: AbortSignal.timeout(10_000) });
|
|
38
|
+
if (res.ok) {
|
|
39
|
+
const data = (await res.json());
|
|
40
|
+
latestVersion = data.version ?? null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (latestVersion) {
|
|
45
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
46
|
+
const cache = {
|
|
47
|
+
lastCheckedAt: new Date().toISOString(),
|
|
48
|
+
latestVersion,
|
|
49
|
+
currentVersion,
|
|
50
|
+
};
|
|
51
|
+
await fs.writeFile(outputPath, `${JSON.stringify(cache, null, 2)}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
main().catch(() => process.exit(0));
|
|
55
|
+
//# sourceMappingURL=update-check-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check-worker.js","sourceRoot":"","sources":["../../src/cli/update-check-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,EAAE,AAAD,EAAG,cAAc,EAAE,aAAa,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAErE,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,gDAAgD,EAChD,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CACxC,CAAC;YACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuC,CAAC;gBACtE,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC;YAChD,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,oEAAoE,EACpE;gBACE,OAAO,EAAE,EAAE,YAAY,EAAE,uBAAuB,EAAE;gBAClD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CACF,CAAC;YACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;gBACzD,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;YAC3D,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,yDAAyD,EACzD,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CACxC,CAAC;YACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;gBACxD,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG;YACZ,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACvC,aAAa;YACb,cAAc;SACf,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CliInstallMethod } from "../core/cli-types.js";
|
|
2
|
+
export interface UpdateCheckCache {
|
|
3
|
+
lastCheckedAt: string;
|
|
4
|
+
latestVersion: string;
|
|
5
|
+
currentVersion: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getUpdateCheckPath(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Read cached update check result. Returns null if missing or expired.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readUpdateCheck(maxAgeMs?: number): Promise<UpdateCheckCache | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Spawn a detached background process to check for the latest CLI version
|
|
14
|
+
* and write the result to the cache file.
|
|
15
|
+
*/
|
|
16
|
+
export declare function spawnUpdateCheck(currentVersion: string, installMethod: CliInstallMethod): void;
|
|
17
|
+
/**
|
|
18
|
+
* Simple semver comparison: returns true if `latest` is newer than `current`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isNewerVersion(current: string, latest: string): boolean;
|
|
21
|
+
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAKD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,SAAa,GACpB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUlC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,gBAAgB,GAC9B,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQvE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { getVanaHome } from "../core/paths.js";
|
|
6
|
+
const UPDATE_CHECK_FILE = "update-check.json";
|
|
7
|
+
const MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
8
|
+
export function getUpdateCheckPath() {
|
|
9
|
+
return path.join(getVanaHome(), UPDATE_CHECK_FILE);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Read cached update check result. Returns null if missing or expired.
|
|
13
|
+
*/
|
|
14
|
+
export async function readUpdateCheck(maxAgeMs = MAX_AGE_MS) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = await fs.readFile(getUpdateCheckPath(), "utf8");
|
|
17
|
+
const cache = JSON.parse(raw);
|
|
18
|
+
const age = Date.now() - new Date(cache.lastCheckedAt).getTime();
|
|
19
|
+
if (age > maxAgeMs || Number.isNaN(age))
|
|
20
|
+
return null;
|
|
21
|
+
return cache;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Spawn a detached background process to check for the latest CLI version
|
|
29
|
+
* and write the result to the cache file.
|
|
30
|
+
*/
|
|
31
|
+
export function spawnUpdateCheck(currentVersion, installMethod) {
|
|
32
|
+
const workerPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "update-check-worker.js");
|
|
33
|
+
const child = spawn(process.execPath, [workerPath, currentVersion, installMethod, getUpdateCheckPath()], {
|
|
34
|
+
detached: true,
|
|
35
|
+
stdio: "ignore",
|
|
36
|
+
});
|
|
37
|
+
child.unref();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Simple semver comparison: returns true if `latest` is newer than `current`.
|
|
41
|
+
*/
|
|
42
|
+
export function isNewerVersion(current, latest) {
|
|
43
|
+
const parse = (v) => v.replace(/^v/, "").split("-")[0].split("+")[0].split(".").map(Number);
|
|
44
|
+
const [cMaj = 0, cMin = 0, cPat = 0] = parse(current);
|
|
45
|
+
const [lMaj = 0, lMin = 0, lPat = 0] = parse(latest);
|
|
46
|
+
if (lMaj !== cMaj)
|
|
47
|
+
return lMaj > cMaj;
|
|
48
|
+
if (lMin !== cMin)
|
|
49
|
+
return lMin > cMin;
|
|
50
|
+
return lPat > cPat;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAS/C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAEnD,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAQ,GAAG,UAAU;IAErB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,IAAI,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAAsB,EACtB,aAA+B;IAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,wBAAwB,CACzB,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,EACjE;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CACF,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAY,EAAE,CACpC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IACtC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IACtC,OAAO,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GAItB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface ConnectorRegistryEntry {
|
|
2
|
+
id?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
company?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
scriptPath?: string;
|
|
7
|
+
script_path?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
checksums?: {
|
|
10
|
+
script?: string;
|
|
11
|
+
};
|
|
12
|
+
exportFrequency?: string;
|
|
13
|
+
iconURL?: string;
|
|
14
|
+
files?: {
|
|
15
|
+
script?: string;
|
|
16
|
+
metadata?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ConnectorMetadata {
|
|
20
|
+
id: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
scopes?: Array<{
|
|
23
|
+
scope: string;
|
|
24
|
+
label: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}>;
|
|
27
|
+
exportFrequency?: string;
|
|
28
|
+
iconURL?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ConnectorResolution {
|
|
31
|
+
source: string;
|
|
32
|
+
name: string;
|
|
33
|
+
company?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
connectorPath: string;
|
|
36
|
+
version?: string;
|
|
37
|
+
updated?: boolean;
|
|
38
|
+
previousVersion?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AvailableSource {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
company?: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
version?: string;
|
|
46
|
+
exportFrequency?: string;
|
|
47
|
+
scopeLabels?: string[];
|
|
48
|
+
authMode?: "automated" | "interactive" | "legacy";
|
|
49
|
+
}
|
|
50
|
+
export declare function listAvailableSources(dataConnectorsDir?: string): Promise<AvailableSource[]>;
|
|
51
|
+
export declare function resolveConnector(source: string, connectorCacheDir: string, dataConnectorsDir?: string): Promise<ConnectorResolution | null>;
|
|
52
|
+
export declare function findCachedConnectorScript(source: string, connectorCacheDir: string): Promise<string | null>;
|
|
53
|
+
export declare function fetchConnectorToCache(source: string, connectorCacheDir: string, dataConnectorsDir?: string, currentVersion?: string): Promise<ConnectorResolution>;
|
|
54
|
+
export declare function readCachedConnectorMetadata(source: string, cacheDir: string): Promise<ConnectorMetadata | null>;
|
|
55
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,sBAAsB;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,QAAQ,CAAC;CACnD;AAED,wBAAsB,oBAAoB,CACxC,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC,CAiB5B;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgCrC;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,mBAAmB,CAAC,CA0H9B;AAiID,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAuBnC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { getConnectorCacheDir } from "../core/paths.js";
|
|
5
|
+
const REGISTRY_URL = "https://raw.githubusercontent.com/vana-com/data-connectors/main/registry.json";
|
|
6
|
+
const BASE_URL = "https://raw.githubusercontent.com/vana-com/data-connectors/main";
|
|
7
|
+
export async function listAvailableSources(dataConnectorsDir) {
|
|
8
|
+
const registry = await loadRegistry(dataConnectorsDir);
|
|
9
|
+
const sources = await Promise.all((registry.connectors ?? []).map(async (entry) => {
|
|
10
|
+
const source = toAvailableSource(entry);
|
|
11
|
+
if (!source) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
source.authMode = await detectAuthMode(entry, dataConnectorsDir);
|
|
15
|
+
return source;
|
|
16
|
+
}));
|
|
17
|
+
return sources
|
|
18
|
+
.filter((value) => Boolean(value))
|
|
19
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
20
|
+
}
|
|
21
|
+
export async function resolveConnector(source, connectorCacheDir, dataConnectorsDir) {
|
|
22
|
+
const registry = await loadRegistry(dataConnectorsDir);
|
|
23
|
+
const normalizedSource = source.toLowerCase();
|
|
24
|
+
const match = (registry.connectors ?? []).find((entry) => {
|
|
25
|
+
const id = (entry.id ?? "").toLowerCase();
|
|
26
|
+
const name = (entry.name ?? "").toLowerCase();
|
|
27
|
+
return (id === normalizedSource ||
|
|
28
|
+
name === normalizedSource ||
|
|
29
|
+
id.includes(normalizedSource) ||
|
|
30
|
+
name.includes(normalizedSource));
|
|
31
|
+
});
|
|
32
|
+
if (!match) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const scriptPath = match.scriptPath ?? match.script_path;
|
|
36
|
+
const resolvedScriptPath = scriptPath ?? match.files?.script;
|
|
37
|
+
if (!resolvedScriptPath) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
|
|
42
|
+
name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
|
|
43
|
+
company: match.company,
|
|
44
|
+
description: undefined,
|
|
45
|
+
connectorPath: path.join(connectorCacheDir, resolvedScriptPath),
|
|
46
|
+
version: match.version,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function findCachedConnectorScript(source, connectorCacheDir) {
|
|
50
|
+
const normalizedSource = source.toLowerCase();
|
|
51
|
+
try {
|
|
52
|
+
const entries = await fs.readdir(connectorCacheDir, {
|
|
53
|
+
withFileTypes: true,
|
|
54
|
+
});
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (!entry.isDirectory())
|
|
57
|
+
continue;
|
|
58
|
+
const companyDir = path.join(connectorCacheDir, entry.name);
|
|
59
|
+
const files = await fs.readdir(companyDir);
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
if (file.endsWith("-playwright.js") &&
|
|
62
|
+
file.replace(/-playwright\.js$/, "").toLowerCase() ===
|
|
63
|
+
normalizedSource) {
|
|
64
|
+
return path.join(companyDir, file);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Cache dir may not exist
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
export async function fetchConnectorToCache(source, connectorCacheDir, dataConnectorsDir, currentVersion) {
|
|
75
|
+
let registry;
|
|
76
|
+
try {
|
|
77
|
+
registry = await loadRegistry(dataConnectorsDir);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Offline fallback: if currentVersion provided and cache exists, return cached
|
|
81
|
+
if (currentVersion) {
|
|
82
|
+
const cachedPath = await findCachedConnectorScript(source, connectorCacheDir);
|
|
83
|
+
if (cachedPath) {
|
|
84
|
+
return {
|
|
85
|
+
source: normalizeSourceName(source) ?? source,
|
|
86
|
+
name: normalizeSourceName(source) ?? source,
|
|
87
|
+
connectorPath: cachedPath,
|
|
88
|
+
version: currentVersion,
|
|
89
|
+
updated: false,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
const normalizedSource = source.toLowerCase();
|
|
96
|
+
const match = (registry.connectors ?? []).find((entry) => {
|
|
97
|
+
const id = (entry.id ?? "").toLowerCase();
|
|
98
|
+
const name = (entry.name ?? "").toLowerCase();
|
|
99
|
+
const normalizedId = normalizeSourceName(entry.id)?.toLowerCase() ?? "";
|
|
100
|
+
return (id === normalizedSource ||
|
|
101
|
+
name === normalizedSource ||
|
|
102
|
+
normalizedId === normalizedSource ||
|
|
103
|
+
id.includes(normalizedSource) ||
|
|
104
|
+
name.includes(normalizedSource) ||
|
|
105
|
+
normalizedId.includes(normalizedSource));
|
|
106
|
+
});
|
|
107
|
+
if (!match) {
|
|
108
|
+
throw new Error(`No connector is available for ${source} right now.`);
|
|
109
|
+
}
|
|
110
|
+
const scriptRelPath = match.files?.script ?? match.scriptPath ?? match.script_path;
|
|
111
|
+
const metadataRelPath = match.files?.metadata ?? scriptRelPath?.replace(/\.js$/i, ".json");
|
|
112
|
+
if (!scriptRelPath) {
|
|
113
|
+
throw new Error(`Connector metadata for ${source} is missing a script path.`);
|
|
114
|
+
}
|
|
115
|
+
// Version-aware caching: skip download when versions match and file exists
|
|
116
|
+
if (match.version && currentVersion && match.version === currentVersion) {
|
|
117
|
+
const cachedScriptPath = path.join(connectorCacheDir, scriptRelPath);
|
|
118
|
+
try {
|
|
119
|
+
await fs.access(cachedScriptPath);
|
|
120
|
+
return {
|
|
121
|
+
source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
|
|
122
|
+
name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
|
|
123
|
+
company: match.company,
|
|
124
|
+
description: match.description,
|
|
125
|
+
connectorPath: cachedScriptPath,
|
|
126
|
+
version: match.version,
|
|
127
|
+
updated: false,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// File missing despite version match — fall through to download
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
await copyOrFetchFile(scriptRelPath, connectorCacheDir, dataConnectorsDir);
|
|
135
|
+
// Verify checksum if one is specified in the registry.
|
|
136
|
+
if (match.checksums?.script) {
|
|
137
|
+
const scriptDest = path.join(connectorCacheDir, scriptRelPath);
|
|
138
|
+
const content = await fs.readFile(scriptDest);
|
|
139
|
+
const hash = crypto.createHash("sha256").update(content).digest("hex");
|
|
140
|
+
const expected = match.checksums.script.replace(/^sha256:/i, "");
|
|
141
|
+
if (hash !== expected) {
|
|
142
|
+
await fs.rm(scriptDest, { force: true });
|
|
143
|
+
throw new Error(`Checksum mismatch for ${source} connector script (expected ${expected}, got ${hash}).`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (metadataRelPath) {
|
|
147
|
+
await copyOrFetchFile(metadataRelPath, connectorCacheDir, dataConnectorsDir).catch(() => {
|
|
148
|
+
// Metadata may not exist for every connector.
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Cache the icon if available.
|
|
152
|
+
if (match.iconURL) {
|
|
153
|
+
const normalizedSource = normalizeSourceName(match.id ?? match.name ?? source) ?? source;
|
|
154
|
+
const ext = path.extname(new URL(match.iconURL).pathname) || ".png";
|
|
155
|
+
const iconDest = path.join(connectorCacheDir, `${normalizedSource}.icon${ext}`);
|
|
156
|
+
await fetchIcon(match.iconURL, iconDest).catch(() => {
|
|
157
|
+
// Icon download failure is non-fatal.
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
|
|
162
|
+
name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
|
|
163
|
+
company: match.company,
|
|
164
|
+
description: match.description,
|
|
165
|
+
connectorPath: path.join(connectorCacheDir, scriptRelPath),
|
|
166
|
+
version: match.version,
|
|
167
|
+
updated: true,
|
|
168
|
+
previousVersion: currentVersion,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async function loadRegistry(dataConnectorsDir) {
|
|
172
|
+
if (dataConnectorsDir) {
|
|
173
|
+
try {
|
|
174
|
+
const localRegistry = await fs.readFile(path.join(dataConnectorsDir, "registry.json"), "utf8");
|
|
175
|
+
return JSON.parse(localRegistry);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Fall through to remote fetch.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const response = await fetch(REGISTRY_URL, {
|
|
182
|
+
headers: { "User-Agent": "@opendatalabs/connect" },
|
|
183
|
+
});
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
throw new Error(`Failed to load connector registry: ${response.status}`);
|
|
186
|
+
}
|
|
187
|
+
return (await response.json());
|
|
188
|
+
}
|
|
189
|
+
async function copyOrFetchFile(relativePath, connectorCacheDir, dataConnectorsDir) {
|
|
190
|
+
const destination = path.join(connectorCacheDir, relativePath);
|
|
191
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
192
|
+
if (dataConnectorsDir) {
|
|
193
|
+
const localPath = path.join(dataConnectorsDir, relativePath);
|
|
194
|
+
try {
|
|
195
|
+
const content = await fs.readFile(localPath);
|
|
196
|
+
await fs.writeFile(destination, content);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Fall through to remote fetch.
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const response = await fetch(`${BASE_URL}/${relativePath}`, {
|
|
204
|
+
headers: { "User-Agent": "@opendatalabs/connect" },
|
|
205
|
+
});
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
throw new Error(`Failed to download ${relativePath}: ${response.status}`);
|
|
208
|
+
}
|
|
209
|
+
const content = Buffer.from(await response.arrayBuffer());
|
|
210
|
+
await fs.writeFile(destination, content);
|
|
211
|
+
}
|
|
212
|
+
async function detectAuthMode(entry, dataConnectorsDir) {
|
|
213
|
+
const relativePath = entry.files?.script ?? entry.scriptPath ?? entry.script_path;
|
|
214
|
+
if (!relativePath) {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
let script = "";
|
|
218
|
+
// Try the connector cache first (most up-to-date after fetch)
|
|
219
|
+
const cacheDir = getConnectorCacheDir();
|
|
220
|
+
try {
|
|
221
|
+
script = await fs.readFile(path.join(cacheDir, relativePath), "utf8");
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Not cached — try local data-connectors checkout
|
|
225
|
+
if (dataConnectorsDir) {
|
|
226
|
+
try {
|
|
227
|
+
script = await fs.readFile(path.join(dataConnectorsDir, relativePath), "utf8");
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
script = "";
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (!script) {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
if (/page\.requestInput\(/.test(script)) {
|
|
238
|
+
return "interactive";
|
|
239
|
+
}
|
|
240
|
+
if (/page\.(showBrowser|promptUser)\(/.test(script)) {
|
|
241
|
+
return "legacy";
|
|
242
|
+
}
|
|
243
|
+
return "automated";
|
|
244
|
+
}
|
|
245
|
+
function normalizeSourceName(source) {
|
|
246
|
+
if (!source) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return source.replace(/-playwright$/i, "");
|
|
250
|
+
}
|
|
251
|
+
function toAvailableSource(entry) {
|
|
252
|
+
const id = normalizeSourceName(entry.id ?? entry.name);
|
|
253
|
+
if (!id) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
id,
|
|
258
|
+
name: entry.name ?? id,
|
|
259
|
+
company: entry.company,
|
|
260
|
+
description: entry.description,
|
|
261
|
+
version: entry.version,
|
|
262
|
+
exportFrequency: entry.exportFrequency,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
export async function readCachedConnectorMetadata(source, cacheDir) {
|
|
266
|
+
try {
|
|
267
|
+
const entries = await fs.readdir(cacheDir, { withFileTypes: true });
|
|
268
|
+
for (const entry of entries) {
|
|
269
|
+
if (!entry.isDirectory()) {
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
const metadataPath = path.join(cacheDir, entry.name, `${source}-playwright.json`);
|
|
273
|
+
try {
|
|
274
|
+
const raw = await fs.readFile(metadataPath, "utf8");
|
|
275
|
+
return JSON.parse(raw);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Not found in this subdirectory.
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Cache directory may not exist yet.
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
async function fetchIcon(url, destination) {
|
|
288
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
289
|
+
const response = await fetch(url, {
|
|
290
|
+
headers: { "User-Agent": "@opendatalabs/connect" },
|
|
291
|
+
});
|
|
292
|
+
if (!response.ok) {
|
|
293
|
+
throw new Error(`Failed to download icon: ${response.status}`);
|
|
294
|
+
}
|
|
295
|
+
const content = Buffer.from(await response.arrayBuffer());
|
|
296
|
+
await fs.writeFile(destination, content);
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"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"}
|