vana-cli 0.24.4 → 0.25.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.
Files changed (70) hide show
  1. package/dist/cli/auth.d.ts.map +1 -1
  2. package/dist/cli/auth.js +20 -1
  3. package/dist/cli/auth.js.map +1 -1
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +98 -14
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/connectors/registry.d.ts +2 -0
  9. package/dist/connectors/registry.d.ts.map +1 -1
  10. package/dist/connectors/registry.js +18 -2
  11. package/dist/connectors/registry.js.map +1 -1
  12. package/dist/core/cli-types.d.ts +44 -0
  13. package/dist/core/cli-types.d.ts.map +1 -1
  14. package/dist/core/cli-types.js +14 -0
  15. package/dist/core/cli-types.js.map +1 -1
  16. package/dist/core/state-store.d.ts +6 -0
  17. package/dist/core/state-store.d.ts.map +1 -1
  18. package/dist/core/state-store.js.map +1 -1
  19. package/dist/pdpp/host.d.ts +66 -0
  20. package/dist/pdpp/host.d.ts.map +1 -0
  21. package/dist/pdpp/host.js +283 -0
  22. package/dist/pdpp/host.js.map +1 -0
  23. package/dist/pdpp/installer.d.ts +17 -0
  24. package/dist/pdpp/installer.d.ts.map +1 -0
  25. package/dist/pdpp/installer.js +117 -0
  26. package/dist/pdpp/installer.js.map +1 -0
  27. package/dist/pdpp/local.d.ts +14 -0
  28. package/dist/pdpp/local.d.ts.map +1 -0
  29. package/dist/pdpp/local.js +76 -0
  30. package/dist/pdpp/local.js.map +1 -0
  31. package/dist/pdpp/pins.d.ts +23 -0
  32. package/dist/pdpp/pins.d.ts.map +1 -0
  33. package/dist/pdpp/pins.js +18 -0
  34. package/dist/pdpp/pins.js.map +1 -0
  35. package/dist/pdpp/profile.d.ts +49 -0
  36. package/dist/pdpp/profile.d.ts.map +1 -0
  37. package/dist/pdpp/profile.js +17 -0
  38. package/dist/pdpp/profile.js.map +1 -0
  39. package/dist/pdpp/protocol.d.ts +79 -0
  40. package/dist/pdpp/protocol.d.ts.map +1 -0
  41. package/dist/pdpp/protocol.js +372 -0
  42. package/dist/pdpp/protocol.js.map +1 -0
  43. package/dist/pdpp/runtime.d.ts +43 -0
  44. package/dist/pdpp/runtime.d.ts.map +1 -0
  45. package/dist/pdpp/runtime.js +387 -0
  46. package/dist/pdpp/runtime.js.map +1 -0
  47. package/dist/pdpp/store.d.ts +43 -0
  48. package/dist/pdpp/store.d.ts.map +1 -0
  49. package/dist/pdpp/store.js +100 -0
  50. package/dist/pdpp/store.js.map +1 -0
  51. package/dist/runtime/core/contracts.d.ts +2 -0
  52. package/dist/runtime/core/contracts.d.ts.map +1 -1
  53. package/dist/runtime/managed-playwright.d.ts +7 -0
  54. package/dist/runtime/managed-playwright.d.ts.map +1 -1
  55. package/dist/runtime/managed-playwright.js +7 -0
  56. package/dist/runtime/managed-playwright.js.map +1 -1
  57. package/dist/vendor/pdpp-connector-manager/LICENSE +202 -0
  58. package/dist/vendor/pdpp-connector-manager/NOTICE +2 -0
  59. package/dist/vendor/pdpp-connector-manager/VENDOR.md +27 -0
  60. package/dist/vendor/pdpp-connector-manager/catalog-schema-data.mjs +168 -0
  61. package/dist/vendor/pdpp-connector-manager/catalog-schema.mjs +62 -0
  62. package/dist/vendor/pdpp-connector-manager/index.d.mts +49 -0
  63. package/dist/vendor/pdpp-connector-manager/index.mjs +1646 -0
  64. package/dist/vendor/pdpp-connector-manager/oci-catalog.mjs +93 -0
  65. package/dist/vendor/pdpp-connector-manager/oci-registry.mjs +1002 -0
  66. package/dist/vendor/pdpp-connector-manager/oci-verify.mjs +515 -0
  67. package/dist/vendor/pdpp-connector-manager/package.json +51 -0
  68. package/dist/vendor/pdpp-connector-manager/retry.mjs +142 -0
  69. package/dist/vendor/pdpp-connector-manager/tar-stream.mjs +685 -0
  70. package/package.json +7 -2
@@ -0,0 +1,283 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import fsp from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { execFile, execFileSync } from "node:child_process";
7
+ import { createRequire } from "node:module";
8
+ import { promisify } from "node:util";
9
+ import * as tar from "tar";
10
+ import { getVanaHome } from "../core/paths.js";
11
+ import { getSystemChromePath } from "../runtime/playwright/index.js";
12
+ const execFileAsync = promisify(execFile);
13
+ const require = createRequire(import.meta.url);
14
+ /** Everything the CLI keeps for Collection Profile connectors. */
15
+ export function getPdppHome() {
16
+ return path.join(getVanaHome(), "pdpp");
17
+ }
18
+ /**
19
+ * The Node release installed when no compatible one is found. It matches the
20
+ * runtime Vana Desktop bundles, and the checksums are the official
21
+ * SHASUMS256.txt values, so a download is checked against a hash that
22
+ * shipped with the CLI rather than one fetched next to the tarball.
23
+ */
24
+ export const PDPP_NODE_VERSION = "24.21.0";
25
+ const PDPP_NODE_SHA256 = {
26
+ "darwin-arm64": "bed7eea5325e1108f32ce5228ddd6a5f0f08a499ee42aa7442aea583702f6057",
27
+ "darwin-x64": "1462cb3b3046b815cf8ea436d3da450ec1a9f11dac7e5a46b0ada5305d7e8097",
28
+ "linux-arm64": "724282c3b43aec998aa9527380465b45d229e021b58035f5f4f63095eabfe5d5",
29
+ "linux-x64": "6e1db87ef58b8819e5d5402eff1536491b18edd8eb7bee5ef7897876e88dc5ff",
30
+ };
31
+ function parseVersion(value) {
32
+ const match = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?$/.exec(value.trim());
33
+ if (!match)
34
+ return null;
35
+ return [Number(match[1]), Number(match[2] ?? 0), Number(match[3] ?? 0)];
36
+ }
37
+ function compareVersions(left, right) {
38
+ for (let index = 0; index < 3; index += 1) {
39
+ const difference = left[index] - right[index];
40
+ if (difference !== 0)
41
+ return difference;
42
+ }
43
+ return 0;
44
+ }
45
+ /**
46
+ * Whether `version` satisfies a space-separated comparator range such as
47
+ * `>=24.15.0 <25`, the only form artifact provenance uses. Anything the
48
+ * parser does not understand fails closed.
49
+ */
50
+ export function satisfiesNodeRange(version, range) {
51
+ const actual = parseVersion(version);
52
+ if (!actual)
53
+ return false;
54
+ const comparators = range.trim().split(/\s+/).filter(Boolean);
55
+ if (comparators.length === 0)
56
+ return false;
57
+ return comparators.every((comparator) => {
58
+ const match = /^(>=|<=|>|<|=)?(.+)$/.exec(comparator);
59
+ const bound = match ? parseVersion(match[2]) : null;
60
+ if (!match || !bound)
61
+ return false;
62
+ const order = compareVersions(actual, bound);
63
+ switch (match[1] ?? "=") {
64
+ case ">=":
65
+ return order >= 0;
66
+ case "<=":
67
+ return order <= 0;
68
+ case ">":
69
+ return order > 0;
70
+ case "<":
71
+ return order < 0;
72
+ default:
73
+ return order === 0;
74
+ }
75
+ });
76
+ }
77
+ async function readNodeVersion(binary) {
78
+ try {
79
+ const { stdout } = await execFileAsync(binary, ["--version"], {
80
+ timeout: 10_000,
81
+ windowsHide: true,
82
+ });
83
+ // A standalone vana binary answers --version with its own version, which
84
+ // parses but is not a Node release; only a `v`-prefixed line is Node.
85
+ const line = stdout.trim();
86
+ return /^v\d+\.\d+\.\d+$/.test(line) ? line.slice(1) : null;
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function nodeBinaryName() {
93
+ return process.platform === "win32" ? "node.exe" : "node";
94
+ }
95
+ function managedNodeDir() {
96
+ return path.join(getPdppHome(), "node", PDPP_NODE_VERSION);
97
+ }
98
+ function managedNodeBinary() {
99
+ return process.platform === "win32"
100
+ ? path.join(managedNodeDir(), nodeBinaryName())
101
+ : path.join(managedNodeDir(), "bin", nodeBinaryName());
102
+ }
103
+ function candidateNodeBinaries() {
104
+ const candidates = [];
105
+ if (process.env.VANA_PDPP_NODE)
106
+ candidates.push(process.env.VANA_PDPP_NODE);
107
+ candidates.push(managedNodeBinary());
108
+ candidates.push(process.execPath);
109
+ for (const dir of (process.env.PATH ?? "").split(path.delimiter)) {
110
+ if (dir)
111
+ candidates.push(path.join(dir, nodeBinaryName()));
112
+ }
113
+ // nvm installs are usually not on PATH for a version other than the
114
+ // current default, which is exactly the version a connector may need.
115
+ const nvmVersions = path.join(process.env.NVM_DIR ?? path.join(os.homedir(), ".nvm"), "versions", "node");
116
+ try {
117
+ for (const entry of fs.readdirSync(nvmVersions).sort().reverse()) {
118
+ candidates.push(path.join(nvmVersions, entry, "bin", nodeBinaryName()));
119
+ }
120
+ }
121
+ catch {
122
+ // No nvm.
123
+ }
124
+ return [...new Set(candidates.map((candidate) => path.resolve(candidate)))];
125
+ }
126
+ function readNodeVersionSync(binary) {
127
+ try {
128
+ const line = execFileSync(binary, ["--version"], {
129
+ encoding: "utf8",
130
+ timeout: 5_000,
131
+ windowsHide: true,
132
+ stdio: ["ignore", "pipe", "ignore"],
133
+ }).trim();
134
+ return /^v\d+\.\d+\.\d+$/.test(line) ? line.slice(1) : null;
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ /** Synchronous {@link findCompatibleNode}, for status checks that cannot await. */
141
+ export function findCompatibleNodeSync(range) {
142
+ for (const candidate of candidateNodeBinaries()) {
143
+ if (!fs.existsSync(candidate))
144
+ continue;
145
+ const version = readNodeVersionSync(candidate);
146
+ if (version && satisfiesNodeRange(version, range)) {
147
+ return { path: candidate, version };
148
+ }
149
+ }
150
+ return null;
151
+ }
152
+ /**
153
+ * A Node binary on this machine that satisfies `range`, or null.
154
+ *
155
+ * `VANA_PDPP_NODE` wins when it satisfies the range; a standalone vana
156
+ * binary's own Node cannot run a script, so every candidate is asked for its
157
+ * version rather than trusted from `process.version`.
158
+ */
159
+ export async function findCompatibleNode(range) {
160
+ for (const candidate of candidateNodeBinaries()) {
161
+ if (!fs.existsSync(candidate))
162
+ continue;
163
+ const version = await readNodeVersion(candidate);
164
+ if (version && satisfiesNodeRange(version, range)) {
165
+ return { path: candidate, version };
166
+ }
167
+ }
168
+ return null;
169
+ }
170
+ /** Whether the pinned Node release this CLI can install satisfies `range`. */
171
+ export function canInstallNodeFor(range) {
172
+ return (satisfiesNodeRange(PDPP_NODE_VERSION, range) &&
173
+ Boolean(PDPP_NODE_SHA256[`${process.platform}-${process.arch}`]));
174
+ }
175
+ /**
176
+ * Download the pinned Node release into ~/.vana/pdpp/node and check it
177
+ * against the checksum compiled into the CLI before anything is unpacked.
178
+ */
179
+ export async function installManagedNode(logPath) {
180
+ const platformKey = `${process.platform}-${process.arch}`;
181
+ const expected = PDPP_NODE_SHA256[platformKey];
182
+ if (!expected) {
183
+ throw new Error(`No Node ${PDPP_NODE_VERSION} build is pinned for ${platformKey}. Install Node 24 yourself and set VANA_PDPP_NODE to its path.`);
184
+ }
185
+ const archiveName = `node-v${PDPP_NODE_VERSION}-${platformKey}.tar.gz`;
186
+ const url = `https://nodejs.org/dist/v${PDPP_NODE_VERSION}/${archiveName}`;
187
+ await fsp.appendFile(logPath, `Downloading ${url}\n`, "utf8");
188
+ const response = await fetch(url, { headers: { "User-Agent": "vana-cli" } });
189
+ if (!response.ok) {
190
+ throw new Error(`Could not download Node ${PDPP_NODE_VERSION}: ${response.status}`);
191
+ }
192
+ const archive = Buffer.from(await response.arrayBuffer());
193
+ const actual = crypto.createHash("sha256").update(archive).digest("hex");
194
+ if (actual !== expected) {
195
+ throw new Error(`Node ${PDPP_NODE_VERSION} download failed its checksum (expected ${expected}, got ${actual}).`);
196
+ }
197
+ const parent = path.dirname(managedNodeDir());
198
+ await fsp.mkdir(parent, { recursive: true });
199
+ const staging = await fsp.mkdtemp(path.join(parent, ".staging-"));
200
+ try {
201
+ const archivePath = path.join(staging, archiveName);
202
+ await fsp.writeFile(archivePath, archive);
203
+ await tar.x({ file: archivePath, cwd: staging, strip: 1 });
204
+ await fsp.rm(archivePath, { force: true });
205
+ await fsp.rm(managedNodeDir(), { recursive: true, force: true });
206
+ await fsp.rename(staging, managedNodeDir());
207
+ }
208
+ catch (error) {
209
+ await fsp.rm(staging, { recursive: true, force: true });
210
+ throw error;
211
+ }
212
+ await fsp.appendFile(logPath, `Installed Node into ${managedNodeDir()}\n`, "utf8");
213
+ const version = await readNodeVersion(managedNodeBinary());
214
+ if (!version) {
215
+ throw new Error(`Installed Node at ${managedNodeBinary()} does not run.`);
216
+ }
217
+ return { path: managedNodeBinary(), version };
218
+ }
219
+ /**
220
+ * Make each host package an artifact declares resolvable from its install
221
+ * root, at exactly the declared version.
222
+ *
223
+ * A signed artifact leaves its browser driver out and loads it by dynamic
224
+ * import, and ESM resolution ignores NODE_PATH, so the package has to sit in
225
+ * a `node_modules` directory above the artifact. The CLI ships the pinned
226
+ * version and links it there rather than installing a second copy.
227
+ */
228
+ export async function linkHostPackages(installRoot, contract) {
229
+ const nodeModules = path.join(installRoot, "node_modules");
230
+ await fsp.mkdir(nodeModules, { recursive: true });
231
+ for (const declared of contract.packages) {
232
+ let packageRoot;
233
+ try {
234
+ packageRoot = path.dirname(require.resolve(`${declared.package}/package.json`));
235
+ }
236
+ catch {
237
+ throw new Error(`This connector needs ${declared.package} ${declared.declared_version}, which this build of vana does not include.`);
238
+ }
239
+ const { version } = JSON.parse(await fsp.readFile(path.join(packageRoot, "package.json"), "utf8"));
240
+ if (version !== declared.declared_version) {
241
+ throw new Error(`This connector needs ${declared.package} ${declared.declared_version}, but vana includes ${version}. Update vana.`);
242
+ }
243
+ const link = path.join(nodeModules, declared.package);
244
+ await fsp.rm(link, { recursive: true, force: true });
245
+ await fsp.symlink(packageRoot, link, process.platform === "win32" ? "junction" : "dir");
246
+ }
247
+ }
248
+ /** Where connector browser profiles live; owned by the CLI, never shared. */
249
+ export function getPdppProfileRoot() {
250
+ return path.join(getPdppHome(), "profiles");
251
+ }
252
+ function patchrightBrowsersDir() {
253
+ return path.join(getPdppHome(), "browsers");
254
+ }
255
+ /**
256
+ * Environment that decides which browser a connector launches.
257
+ *
258
+ * System Chrome is preferred for the same reason the legacy runtime prefers
259
+ * it: sites treat it as a normal browser. Without it the connector's own
260
+ * patchright Chromium is used, installed once under ~/.vana/pdpp/browsers.
261
+ */
262
+ export function browserEnvironment() {
263
+ if (getSystemChromePath()) {
264
+ return { PDPP_BROWSER_CHANNEL: "chrome" };
265
+ }
266
+ return { PLAYWRIGHT_BROWSERS_PATH: patchrightBrowsersDir() };
267
+ }
268
+ export async function ensureConnectorBrowser(node, logPath) {
269
+ if (getSystemChromePath())
270
+ return;
271
+ const cliPath = path.join(path.dirname(require.resolve("patchright/package.json")), "cli.js");
272
+ await fsp.appendFile(logPath, "Installing Chromium for patchright\n", "utf8");
273
+ const { stdout, stderr } = await execFileAsync(node.path, [cliPath, "install", "chromium"], {
274
+ env: {
275
+ ...process.env,
276
+ PLAYWRIGHT_BROWSERS_PATH: patchrightBrowsersDir(),
277
+ },
278
+ windowsHide: true,
279
+ maxBuffer: 16 * 1024 * 1024,
280
+ });
281
+ await fsp.appendFile(logPath, `${stdout}${stderr}`, "utf8");
282
+ }
283
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/pdpp/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type PdppPin } from "./pins.js";
2
+ import { type PdppLaunch } from "./profile.js";
3
+ export declare function artifactRootFor(pin: PdppPin, installRoot?: string): string;
4
+ /**
5
+ * Read an installed artifact into a launch, refusing one whose manifest does
6
+ * not describe the pinned connector.
7
+ */
8
+ export declare function readInstalledLaunch(pin: PdppPin, artifactRoot: string, installRoot: string): Promise<PdppLaunch>;
9
+ /**
10
+ * Install the pinned artifact if needed and verify it, returning how to run
11
+ * it. Nothing unverified is ever returned: an existing install is re-checked
12
+ * against the registry's signed digest on every call, and a fresh one is
13
+ * unpacked into a staging directory and moved into place only after the
14
+ * installer has checked its signature and every file digest.
15
+ */
16
+ export declare function ensurePinnedArtifact(pin: PdppPin, logPath: string, installRoot?: string): Promise<PdppLaunch>;
17
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/pdpp/installer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAgBvE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,WAAW,SAAgB,GAC1B,MAAM,CAER;AA6BD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAiCrB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,SAAgB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAiDrB"}
@@ -0,0 +1,117 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { getPdppHome } from "./host.js";
5
+ import { pinOciReference } from "./pins.js";
6
+ import { parseCollectionProfile } from "./profile.js";
7
+ // Loaded on first use: sigstore and its dependencies are not worth paying for
8
+ // on every CLI start, and legacy sources never need them.
9
+ async function loadInstallerCore() {
10
+ return (await import("../vendor/pdpp-connector-manager/index.mjs"));
11
+ }
12
+ const PROFILE_PATH = "profile/collection-profile.json";
13
+ const ENTRYPOINT_PATH = "dist/collection-profile.mjs";
14
+ const PROVENANCE_PATH = "provenance.json";
15
+ export function artifactRootFor(pin, installRoot = getPdppHome()) {
16
+ return path.join(installRoot, "collection-profiles", pin.id);
17
+ }
18
+ function lockFor(core, pin) {
19
+ const reference = core.parseConnectorOciReference(pinOciReference(pin));
20
+ return {
21
+ lockVersion: "2.0",
22
+ connectors: [
23
+ {
24
+ connectorId: pin.id,
25
+ connectorKey: reference.connectorKey,
26
+ version: pin.version,
27
+ artifactKind: "pdpp-collection-profile",
28
+ manifestPath: PROFILE_PATH,
29
+ entrypointPath: ENTRYPOINT_PATH,
30
+ provenancePath: PROVENANCE_PATH,
31
+ oci: {
32
+ registry: reference.registry,
33
+ repository: reference.repository,
34
+ digest: reference.digest,
35
+ },
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ async function readJson(file) {
41
+ return JSON.parse(await fsp.readFile(file, "utf8"));
42
+ }
43
+ /**
44
+ * Read an installed artifact into a launch, refusing one whose manifest does
45
+ * not describe the pinned connector.
46
+ */
47
+ export async function readInstalledLaunch(pin, artifactRoot, installRoot) {
48
+ const profile = parseCollectionProfile(await readJson(path.join(artifactRoot, PROFILE_PATH)), `${pin.name} profile`);
49
+ if (profile.connector_key !== pin.id || profile.version !== pin.version) {
50
+ throw new Error(`The installed ${pin.name} connector is ${profile.connector_key} ${profile.version}, not the pinned ${pin.id} ${pin.version}.`);
51
+ }
52
+ const provenance = (await readJson(path.join(artifactRoot, PROVENANCE_PATH)));
53
+ const contract = provenance.host_runtime_contract;
54
+ if (!contract || typeof contract.node !== "string") {
55
+ throw new Error(`The ${pin.name} connector does not say which Node it needs.`);
56
+ }
57
+ return {
58
+ source: pin.id,
59
+ displayName: profile.display_name ?? pin.name,
60
+ version: profile.version,
61
+ profile,
62
+ args: [path.join(artifactRoot, ENTRYPOINT_PATH)],
63
+ cwd: artifactRoot,
64
+ nodeRange: contract.node,
65
+ installRoot,
66
+ hostPackages: Array.isArray(contract.packages) ? contract.packages : [],
67
+ origin: "pinned",
68
+ };
69
+ }
70
+ /**
71
+ * Install the pinned artifact if needed and verify it, returning how to run
72
+ * it. Nothing unverified is ever returned: an existing install is re-checked
73
+ * against the registry's signed digest on every call, and a fresh one is
74
+ * unpacked into a staging directory and moved into place only after the
75
+ * installer has checked its signature and every file digest.
76
+ */
77
+ export async function ensurePinnedArtifact(pin, logPath, installRoot = getPdppHome()) {
78
+ const core = await loadInstallerCore();
79
+ const lock = lockFor(core, pin);
80
+ const artifactRoot = artifactRootFor(pin, installRoot);
81
+ await fsp.mkdir(installRoot, { recursive: true });
82
+ if (fs.existsSync(artifactRoot)) {
83
+ const verified = await core.verifyInstalled({
84
+ lock,
85
+ source: null,
86
+ installRoot,
87
+ layout: "snapshot",
88
+ });
89
+ if (verified.ok) {
90
+ await fsp.appendFile(logPath, `Verified ${pinOciReference(pin)}\n`, "utf8");
91
+ return readInstalledLaunch(pin, artifactRoot, installRoot);
92
+ }
93
+ await fsp.appendFile(logPath, `Installed ${pin.id} failed verification (missing: ${verified.missing.join(", ") || "none"}; changed: ${verified.mismatched.join(", ") || "none"}); reinstalling.\n`, "utf8");
94
+ }
95
+ const staging = await fsp.mkdtemp(path.join(installRoot, ".staging-"));
96
+ try {
97
+ await core.installFromLock({
98
+ lock,
99
+ source: null,
100
+ installRoot: staging,
101
+ layout: "snapshot",
102
+ allowTagResolution: false,
103
+ });
104
+ const stagedArtifact = artifactRootFor(pin, staging);
105
+ // Validate before the swap so a bad artifact never replaces a good one.
106
+ await readInstalledLaunch(pin, stagedArtifact, installRoot);
107
+ await fsp.mkdir(path.dirname(artifactRoot), { recursive: true });
108
+ await fsp.rm(artifactRoot, { recursive: true, force: true });
109
+ await fsp.rename(stagedArtifact, artifactRoot);
110
+ }
111
+ finally {
112
+ await fsp.rm(staging, { recursive: true, force: true });
113
+ }
114
+ await fsp.appendFile(logPath, `Installed ${pinOciReference(pin)}\n`, "utf8");
115
+ return readInstalledLaunch(pin, artifactRoot, installRoot);
116
+ }
117
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/pdpp/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type PdppLaunch } from "./profile.js";
2
+ /**
3
+ * Run a connector from a data-connectors checkout instead of a signed
4
+ * artifact, the way `connector-dev` does, so an author can test it before it
5
+ * is published.
6
+ *
7
+ * Both layouts are accepted: connectors at the repository root
8
+ * (`connectors/<key>/index.ts` with `connectors/<key>/manifest.json`), and
9
+ * the earlier `packages/polyfill-connectors/connectors/<key>/index.ts` with
10
+ * `manifests/<key>.json`. The checkout's own `node_modules` supplies tsx and
11
+ * the browser driver.
12
+ */
13
+ export declare function resolveLocalLaunch(checkout: string, source: string): Promise<PdppLaunch>;
14
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/pdpp/local.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAqBvE;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAsDrB"}
@@ -0,0 +1,76 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { parseCollectionProfile } from "./profile.js";
5
+ /** The published artifacts' range, used when a checkout declares none. */
6
+ const DEFAULT_NODE_RANGE = ">=24.15.0 <25";
7
+ function firstExisting(candidates) {
8
+ return candidates.find((candidate) => fs.existsSync(candidate)) ?? null;
9
+ }
10
+ /** Nearest directory at or above `start`, up to `stop`, with tsx installed. */
11
+ function findToolRoot(start, stop) {
12
+ let current = start;
13
+ while (true) {
14
+ if (fs.existsSync(path.join(current, "node_modules", "tsx"))) {
15
+ return current;
16
+ }
17
+ if (current === stop || path.dirname(current) === current)
18
+ return null;
19
+ current = path.dirname(current);
20
+ }
21
+ }
22
+ /**
23
+ * Run a connector from a data-connectors checkout instead of a signed
24
+ * artifact, the way `connector-dev` does, so an author can test it before it
25
+ * is published.
26
+ *
27
+ * Both layouts are accepted: connectors at the repository root
28
+ * (`connectors/<key>/index.ts` with `connectors/<key>/manifest.json`), and
29
+ * the earlier `packages/polyfill-connectors/connectors/<key>/index.ts` with
30
+ * `manifests/<key>.json`. The checkout's own `node_modules` supplies tsx and
31
+ * the browser driver.
32
+ */
33
+ export async function resolveLocalLaunch(checkout, source) {
34
+ const root = path.resolve(checkout);
35
+ const key = source.toLowerCase();
36
+ const bases = [root, path.join(root, "packages", "polyfill-connectors")];
37
+ for (const base of bases) {
38
+ const entry = path.join(base, "connectors", key, "index.ts");
39
+ if (!fs.existsSync(entry))
40
+ continue;
41
+ const manifestPath = firstExisting([
42
+ path.join(base, "connectors", key, "manifest.json"),
43
+ path.join(base, "manifests", `${key}.json`),
44
+ ]);
45
+ if (!manifestPath) {
46
+ throw new Error(`Found ${entry} but no manifest for ${key}.`);
47
+ }
48
+ const profile = parseCollectionProfile(JSON.parse(await fsp.readFile(manifestPath, "utf8")), manifestPath);
49
+ const cwd = findToolRoot(path.dirname(entry), root);
50
+ if (!cwd) {
51
+ throw new Error(`tsx is not installed in ${root}. Run npm install there first.`);
52
+ }
53
+ let nodeRange = DEFAULT_NODE_RANGE;
54
+ try {
55
+ const pkg = JSON.parse(await fsp.readFile(path.join(cwd, "package.json"), "utf8"));
56
+ nodeRange = pkg.engines?.node ?? DEFAULT_NODE_RANGE;
57
+ }
58
+ catch {
59
+ // No package.json at the tool root; keep the default.
60
+ }
61
+ return {
62
+ source: key,
63
+ displayName: profile.display_name ?? key,
64
+ version: profile.version,
65
+ profile,
66
+ args: ["--import", "tsx", entry],
67
+ cwd,
68
+ nodeRange,
69
+ installRoot: null,
70
+ hostPackages: [],
71
+ origin: "local",
72
+ };
73
+ }
74
+ throw new Error(`No connector named ${key} in ${root}. Looked for connectors/${key}/index.ts at the root and under packages/polyfill-connectors.`);
75
+ }
76
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/pdpp/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Collection Profile connectors this CLI will install, each pinned to one
3
+ * signed artifact digest.
4
+ *
5
+ * The published catalog lists every connector the data-connectors repo
6
+ * builds, most of them untested against a real account and many sharing an
7
+ * id with a legacy connector. Pinning follows Vana Desktop's admission list:
8
+ * a connector appears here once it has been proven end to end, and the digest
9
+ * is what gets verified, so a catalog update cannot change what runs.
10
+ */
11
+ export interface PdppPin {
12
+ /** Source id in `vana sources`, and the connector key in the registry. */
13
+ id: string;
14
+ name: string;
15
+ company: string;
16
+ description: string;
17
+ version: string;
18
+ digest: string;
19
+ }
20
+ export declare const PDPP_PINS: readonly PdppPin[];
21
+ export declare function findPdppPin(source: string): PdppPin | null;
22
+ export declare function pinOciReference(pin: PdppPin): string;
23
+ //# sourceMappingURL=pins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.d.ts","sourceRoot":"","sources":["../../src/pdpp/pins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,OAAO,EAWvC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG1D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,18 @@
1
+ export const PDPP_PINS = [
2
+ {
3
+ id: "whoop",
4
+ name: "WHOOP",
5
+ company: "WHOOP",
6
+ description: "Exports your WHOOP profile, body measurements, cycles, recoveries, sleeps and workouts.",
7
+ version: "0.1.0",
8
+ digest: "sha256:daafcf17033be65aac5acd6e106a3d25df370be09b8a6fdda5932ec069b0d114",
9
+ },
10
+ ];
11
+ export function findPdppPin(source) {
12
+ const id = source.toLowerCase();
13
+ return PDPP_PINS.find((pin) => pin.id === id) ?? null;
14
+ }
15
+ export function pinOciReference(pin) {
16
+ return `ghcr.io/pdp-connect/connector/${pin.id}@${pin.digest}`;
17
+ }
18
+ //# sourceMappingURL=pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.js","sourceRoot":"","sources":["../../src/pdpp/pins.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,SAAS,GAAuB;IAC3C;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,yFAAyF;QAC3F,OAAO,EAAE,OAAO;QAChB,MAAM,EACJ,yEAAyE;KAC5E;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,iCAAiC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,49 @@
1
+ /** The parts of a Collection Profile manifest a host reads. */
2
+ export interface CollectionProfileStream {
3
+ name: string;
4
+ required?: boolean;
5
+ incremental?: boolean;
6
+ display?: {
7
+ label?: string;
8
+ };
9
+ }
10
+ export interface CollectionProfile {
11
+ connector_key: string;
12
+ version: string;
13
+ display_name?: string;
14
+ streams: CollectionProfileStream[];
15
+ capabilities?: {
16
+ human_interaction?: string[];
17
+ };
18
+ runtime_requirements?: {
19
+ bindings?: {
20
+ browser?: {
21
+ required?: boolean;
22
+ };
23
+ };
24
+ };
25
+ }
26
+ /**
27
+ * How to start one connector: the program arguments after `node`, where to
28
+ * run them, and what the host has to provide first.
29
+ */
30
+ export interface PdppLaunch {
31
+ source: string;
32
+ displayName: string;
33
+ version: string;
34
+ profile: CollectionProfile;
35
+ args: string[];
36
+ cwd: string;
37
+ /** Node range from provenance; the connector refuses to run outside it. */
38
+ nodeRange: string;
39
+ /** Where host packages get linked, or null when the source tree has its own. */
40
+ installRoot: string | null;
41
+ hostPackages: Array<{
42
+ package: string;
43
+ declared_version: string;
44
+ }>;
45
+ /** `pinned` runs a verified artifact; `local` runs a checkout's source. */
46
+ origin: "pinned" | "local";
47
+ }
48
+ export declare function parseCollectionProfile(raw: unknown, where: string): CollectionProfile;
49
+ //# sourceMappingURL=profile.d.ts.map