vana-cli 0.15.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/dist/cli/auth.d.ts +119 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +528 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/bin.d.ts +3 -0
  8. package/dist/cli/bin.d.ts.map +1 -0
  9. package/dist/cli/bin.js +15 -0
  10. package/dist/cli/bin.js.map +1 -0
  11. package/dist/cli/index.d.ts +92 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +4703 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/main.d.ts +2 -0
  16. package/dist/cli/main.d.ts.map +1 -0
  17. package/dist/cli/main.js +10 -0
  18. package/dist/cli/main.js.map +1 -0
  19. package/dist/cli/mcp-server.d.ts +15 -0
  20. package/dist/cli/mcp-server.d.ts.map +1 -0
  21. package/dist/cli/mcp-server.js +199 -0
  22. package/dist/cli/mcp-server.js.map +1 -0
  23. package/dist/cli/queries.d.ts +128 -0
  24. package/dist/cli/queries.d.ts.map +1 -0
  25. package/dist/cli/queries.js +422 -0
  26. package/dist/cli/queries.js.map +1 -0
  27. package/dist/cli/render/capabilities.d.ts +9 -0
  28. package/dist/cli/render/capabilities.d.ts.map +1 -0
  29. package/dist/cli/render/capabilities.js +24 -0
  30. package/dist/cli/render/capabilities.js.map +1 -0
  31. package/dist/cli/render/connect-renderer.d.ts +23 -0
  32. package/dist/cli/render/connect-renderer.d.ts.map +1 -0
  33. package/dist/cli/render/connect-renderer.js +259 -0
  34. package/dist/cli/render/connect-renderer.js.map +1 -0
  35. package/dist/cli/render/flow-theme.d.ts +17 -0
  36. package/dist/cli/render/flow-theme.d.ts.map +1 -0
  37. package/dist/cli/render/flow-theme.js +26 -0
  38. package/dist/cli/render/flow-theme.js.map +1 -0
  39. package/dist/cli/render/format.d.ts +27 -0
  40. package/dist/cli/render/format.d.ts.map +1 -0
  41. package/dist/cli/render/format.js +111 -0
  42. package/dist/cli/render/format.js.map +1 -0
  43. package/dist/cli/render/index.d.ts +8 -0
  44. package/dist/cli/render/index.d.ts.map +1 -0
  45. package/dist/cli/render/index.js +8 -0
  46. package/dist/cli/render/index.js.map +1 -0
  47. package/dist/cli/render/progress.d.ts +11 -0
  48. package/dist/cli/render/progress.d.ts.map +1 -0
  49. package/dist/cli/render/progress.js +56 -0
  50. package/dist/cli/render/progress.js.map +1 -0
  51. package/dist/cli/render/symbols.d.ts +11 -0
  52. package/dist/cli/render/symbols.d.ts.map +1 -0
  53. package/dist/cli/render/symbols.js +21 -0
  54. package/dist/cli/render/symbols.js.map +1 -0
  55. package/dist/cli/render/theme.d.ts +16 -0
  56. package/dist/cli/render/theme.d.ts.map +1 -0
  57. package/dist/cli/render/theme.js +57 -0
  58. package/dist/cli/render/theme.js.map +1 -0
  59. package/dist/cli/search-select.d.ts +17 -0
  60. package/dist/cli/search-select.d.ts.map +1 -0
  61. package/dist/cli/search-select.js +29 -0
  62. package/dist/cli/search-select.js.map +1 -0
  63. package/dist/cli/telemetry-contract.d.ts +146 -0
  64. package/dist/cli/telemetry-contract.d.ts.map +1 -0
  65. package/dist/cli/telemetry-contract.js +56 -0
  66. package/dist/cli/telemetry-contract.js.map +1 -0
  67. package/dist/cli/telemetry.d.ts +60 -0
  68. package/dist/cli/telemetry.d.ts.map +1 -0
  69. package/dist/cli/telemetry.js +621 -0
  70. package/dist/cli/telemetry.js.map +1 -0
  71. package/dist/cli/update-check.d.ts +21 -0
  72. package/dist/cli/update-check.d.ts.map +1 -0
  73. package/dist/cli/update-check.js +86 -0
  74. package/dist/cli/update-check.js.map +1 -0
  75. package/dist/connectors/index.d.ts +2 -0
  76. package/dist/connectors/index.d.ts.map +1 -0
  77. package/dist/connectors/index.js +2 -0
  78. package/dist/connectors/index.js.map +1 -0
  79. package/dist/connectors/registry.d.ts +55 -0
  80. package/dist/connectors/registry.d.ts.map +1 -0
  81. package/dist/connectors/registry.js +301 -0
  82. package/dist/connectors/registry.js.map +1 -0
  83. package/dist/core/cli-types.d.ts +722 -0
  84. package/dist/core/cli-types.d.ts.map +1 -0
  85. package/dist/core/cli-types.js +328 -0
  86. package/dist/core/cli-types.js.map +1 -0
  87. package/dist/core/constants.d.ts +33 -0
  88. package/dist/core/constants.d.ts.map +1 -0
  89. package/dist/core/constants.js +25 -0
  90. package/dist/core/constants.js.map +1 -0
  91. package/dist/core/errors.d.ts +47 -0
  92. package/dist/core/errors.d.ts.map +1 -0
  93. package/dist/core/errors.js +50 -0
  94. package/dist/core/errors.js.map +1 -0
  95. package/dist/core/grants.d.ts +19 -0
  96. package/dist/core/grants.d.ts.map +1 -0
  97. package/dist/core/grants.js +31 -0
  98. package/dist/core/grants.js.map +1 -0
  99. package/dist/core/index.d.ts +9 -0
  100. package/dist/core/index.d.ts.map +1 -0
  101. package/dist/core/index.js +7 -0
  102. package/dist/core/index.js.map +1 -0
  103. package/dist/core/paths.d.ts +30 -0
  104. package/dist/core/paths.d.ts.map +1 -0
  105. package/dist/core/paths.js +95 -0
  106. package/dist/core/paths.js.map +1 -0
  107. package/dist/core/state-store.d.ts +44 -0
  108. package/dist/core/state-store.d.ts.map +1 -0
  109. package/dist/core/state-store.js +101 -0
  110. package/dist/core/state-store.js.map +1 -0
  111. package/dist/core/types.d.ts +148 -0
  112. package/dist/core/types.d.ts.map +1 -0
  113. package/dist/core/types.js +2 -0
  114. package/dist/core/types.js.map +1 -0
  115. package/dist/index.d.ts +2 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +2 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/personal-server/client.d.ts +34 -0
  120. package/dist/personal-server/client.d.ts.map +1 -0
  121. package/dist/personal-server/client.js +108 -0
  122. package/dist/personal-server/client.js.map +1 -0
  123. package/dist/personal-server/index.d.ts +28 -0
  124. package/dist/personal-server/index.d.ts.map +1 -0
  125. package/dist/personal-server/index.js +157 -0
  126. package/dist/personal-server/index.js.map +1 -0
  127. package/dist/personal-server/scope-resolver.d.ts +22 -0
  128. package/dist/personal-server/scope-resolver.d.ts.map +1 -0
  129. package/dist/personal-server/scope-resolver.js +80 -0
  130. package/dist/personal-server/scope-resolver.js.map +1 -0
  131. package/dist/react/ConnectButton.d.ts +27 -0
  132. package/dist/react/ConnectButton.d.ts.map +1 -0
  133. package/dist/react/ConnectButton.js +39 -0
  134. package/dist/react/ConnectButton.js.map +1 -0
  135. package/dist/react/index.d.ts +4 -0
  136. package/dist/react/index.d.ts.map +1 -0
  137. package/dist/react/index.js +4 -0
  138. package/dist/react/index.js.map +1 -0
  139. package/dist/react/useVanaConnect.d.ts +50 -0
  140. package/dist/react/useVanaConnect.d.ts.map +1 -0
  141. package/dist/react/useVanaConnect.js +114 -0
  142. package/dist/react/useVanaConnect.js.map +1 -0
  143. package/dist/react/useVanaData.d.ts +69 -0
  144. package/dist/react/useVanaData.d.ts.map +1 -0
  145. package/dist/react/useVanaData.js +144 -0
  146. package/dist/react/useVanaData.js.map +1 -0
  147. package/dist/runtime/core/contracts.d.ts +84 -0
  148. package/dist/runtime/core/contracts.d.ts.map +1 -0
  149. package/dist/runtime/core/contracts.js +2 -0
  150. package/dist/runtime/core/contracts.js.map +1 -0
  151. package/dist/runtime/core/index.d.ts +2 -0
  152. package/dist/runtime/core/index.d.ts.map +1 -0
  153. package/dist/runtime/core/index.js +2 -0
  154. package/dist/runtime/core/index.js.map +1 -0
  155. package/dist/runtime/index.d.ts +4 -0
  156. package/dist/runtime/index.d.ts.map +1 -0
  157. package/dist/runtime/index.js +3 -0
  158. package/dist/runtime/index.js.map +1 -0
  159. package/dist/runtime/managed-playwright.d.ts +42 -0
  160. package/dist/runtime/managed-playwright.d.ts.map +1 -0
  161. package/dist/runtime/managed-playwright.js +178 -0
  162. package/dist/runtime/managed-playwright.js.map +1 -0
  163. package/dist/runtime/playwright/browser.d.ts +12 -0
  164. package/dist/runtime/playwright/browser.d.ts.map +1 -0
  165. package/dist/runtime/playwright/browser.js +229 -0
  166. package/dist/runtime/playwright/browser.js.map +1 -0
  167. package/dist/runtime/playwright/in-process-run.d.ts +6 -0
  168. package/dist/runtime/playwright/in-process-run.d.ts.map +1 -0
  169. package/dist/runtime/playwright/in-process-run.js +625 -0
  170. package/dist/runtime/playwright/in-process-run.js.map +1 -0
  171. package/dist/runtime/playwright/index.d.ts +3 -0
  172. package/dist/runtime/playwright/index.d.ts.map +1 -0
  173. package/dist/runtime/playwright/index.js +3 -0
  174. package/dist/runtime/playwright/index.js.map +1 -0
  175. package/dist/runtime/repo-paths.d.ts +2 -0
  176. package/dist/runtime/repo-paths.d.ts.map +1 -0
  177. package/dist/runtime/repo-paths.js +36 -0
  178. package/dist/runtime/repo-paths.js.map +1 -0
  179. package/dist/server/config.d.ts +38 -0
  180. package/dist/server/config.d.ts.map +1 -0
  181. package/dist/server/config.js +45 -0
  182. package/dist/server/config.js.map +1 -0
  183. package/dist/server/connect.d.ts +43 -0
  184. package/dist/server/connect.d.ts.map +1 -0
  185. package/dist/server/connect.js +115 -0
  186. package/dist/server/connect.js.map +1 -0
  187. package/dist/server/data-client.d.ts +31 -0
  188. package/dist/server/data-client.d.ts.map +1 -0
  189. package/dist/server/data-client.js +95 -0
  190. package/dist/server/data-client.js.map +1 -0
  191. package/dist/server/index.d.ts +8 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/dist/server/index.js +8 -0
  194. package/dist/server/index.js.map +1 -0
  195. package/dist/server/manifest-signer.d.ts +25 -0
  196. package/dist/server/manifest-signer.d.ts.map +1 -0
  197. package/dist/server/manifest-signer.js +51 -0
  198. package/dist/server/manifest-signer.js.map +1 -0
  199. package/dist/server/request-signer.d.ts +31 -0
  200. package/dist/server/request-signer.d.ts.map +1 -0
  201. package/dist/server/request-signer.js +72 -0
  202. package/dist/server/request-signer.js.map +1 -0
  203. package/dist/server/session-relay.d.ts +39 -0
  204. package/dist/server/session-relay.d.ts.map +1 -0
  205. package/dist/server/session-relay.js +74 -0
  206. package/dist/server/session-relay.js.map +1 -0
  207. package/dist/server/webhook.d.ts +11 -0
  208. package/dist/server/webhook.d.ts.map +1 -0
  209. package/dist/server/webhook.js +18 -0
  210. package/dist/server/webhook.js.map +1 -0
  211. package/dist/skills/index.d.ts +4 -0
  212. package/dist/skills/index.d.ts.map +1 -0
  213. package/dist/skills/index.js +3 -0
  214. package/dist/skills/index.js.map +1 -0
  215. package/dist/skills/paths.d.ts +33 -0
  216. package/dist/skills/paths.d.ts.map +1 -0
  217. package/dist/skills/paths.js +81 -0
  218. package/dist/skills/paths.js.map +1 -0
  219. package/dist/skills/registry.d.ts +48 -0
  220. package/dist/skills/registry.d.ts.map +1 -0
  221. package/dist/skills/registry.js +173 -0
  222. package/dist/skills/registry.js.map +1 -0
  223. package/package.json +147 -0
@@ -0,0 +1,86 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getVanaHome } from "../core/paths.js";
4
+ const UPDATE_CHECK_FILE = "update-check.json";
5
+ const MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
6
+ const CHECK_TIMEOUT_MS = 5_000;
7
+ export function getUpdateCheckPath() {
8
+ return path.join(getVanaHome(), UPDATE_CHECK_FILE);
9
+ }
10
+ /**
11
+ * Read cached update check result. Returns null if missing or expired.
12
+ */
13
+ export async function readUpdateCheck(maxAgeMs = MAX_AGE_MS) {
14
+ try {
15
+ const raw = await fs.readFile(getUpdateCheckPath(), "utf8");
16
+ const cache = JSON.parse(raw);
17
+ const age = Date.now() - new Date(cache.lastCheckedAt).getTime();
18
+ if (age > maxAgeMs || Number.isNaN(age))
19
+ return null;
20
+ return cache;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Check for the latest CLI version and write the result to the cache file.
28
+ * Runs inline with a short timeout — no child process needed.
29
+ */
30
+ export async function checkForUpdate(currentVersion, installMethod) {
31
+ let latestVersion = null;
32
+ switch (installMethod) {
33
+ case "homebrew": {
34
+ const res = await fetch("https://formulae.brew.sh/api/formula/vana.json", { signal: AbortSignal.timeout(CHECK_TIMEOUT_MS) });
35
+ if (res.ok) {
36
+ const data = (await res.json());
37
+ latestVersion = data.versions?.stable ?? null;
38
+ }
39
+ break;
40
+ }
41
+ case "installer": {
42
+ const res = await fetch("https://api.github.com/repos/vana-com/vana-cli/releases/latest", {
43
+ headers: { "User-Agent": "vana-cli" },
44
+ signal: AbortSignal.timeout(CHECK_TIMEOUT_MS),
45
+ });
46
+ if (res.ok) {
47
+ const data = (await res.json());
48
+ latestVersion = data.tag_name?.replace(/^v/, "") ?? null;
49
+ }
50
+ break;
51
+ }
52
+ default: {
53
+ const res = await fetch("https://registry.npmjs.org/vana-cli/latest", {
54
+ signal: AbortSignal.timeout(CHECK_TIMEOUT_MS),
55
+ });
56
+ if (res.ok) {
57
+ const data = (await res.json());
58
+ latestVersion = data.version ?? null;
59
+ }
60
+ }
61
+ }
62
+ if (latestVersion) {
63
+ const cachePath = getUpdateCheckPath();
64
+ await fs.mkdir(path.dirname(cachePath), { recursive: true });
65
+ const cache = {
66
+ lastCheckedAt: new Date().toISOString(),
67
+ latestVersion,
68
+ currentVersion,
69
+ };
70
+ await fs.writeFile(cachePath, `${JSON.stringify(cache, null, 2)}\n`);
71
+ }
72
+ }
73
+ /**
74
+ * Simple semver comparison: returns true if `latest` is newer than `current`.
75
+ */
76
+ export function isNewerVersion(current, latest) {
77
+ const parse = (v) => v.replace(/^v/, "").split("-")[0].split("+")[0].split(".").map(Number);
78
+ const [cMaj = 0, cMin = 0, cPat = 0] = parse(current);
79
+ const [lMaj = 0, lMin = 0, lPat = 0] = parse(latest);
80
+ if (lMaj !== cMaj)
81
+ return lMaj > cMaj;
82
+ if (lMin !== cMin)
83
+ return lMin > cMin;
84
+ return lPat > cPat;
85
+ }
86
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { listAvailableSources, resolveConnector, fetchConnectorToCache, type AvailableSource, type ConnectorRegistryEntry, type ConnectorResolution, } from "./registry.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { listAvailableSources, resolveConnector, fetchConnectorToCache, } from "./registry.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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":"AAcA,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,301 @@
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
+ // Connector script files live under `connectors/` in the data-connectors
7
+ // repo. The registry.json `baseUrl` field also points here; we mirror it
8
+ // as a constant so offline/local paths resolve correctly too.
9
+ const BASE_URL = "https://raw.githubusercontent.com/vana-com/data-connectors/main/connectors";
10
+ export async function listAvailableSources(dataConnectorsDir) {
11
+ const registry = await loadRegistry(dataConnectorsDir);
12
+ const sources = await Promise.all((registry.connectors ?? []).map(async (entry) => {
13
+ const source = toAvailableSource(entry);
14
+ if (!source) {
15
+ return null;
16
+ }
17
+ source.authMode = await detectAuthMode(entry, dataConnectorsDir);
18
+ return source;
19
+ }));
20
+ return sources
21
+ .filter((value) => Boolean(value))
22
+ .sort((left, right) => left.name.localeCompare(right.name));
23
+ }
24
+ export async function resolveConnector(source, connectorCacheDir, dataConnectorsDir) {
25
+ const registry = await loadRegistry(dataConnectorsDir);
26
+ const normalizedSource = source.toLowerCase();
27
+ const match = (registry.connectors ?? []).find((entry) => {
28
+ const id = (entry.id ?? "").toLowerCase();
29
+ const name = (entry.name ?? "").toLowerCase();
30
+ return (id === normalizedSource ||
31
+ name === normalizedSource ||
32
+ id.includes(normalizedSource) ||
33
+ name.includes(normalizedSource));
34
+ });
35
+ if (!match) {
36
+ return null;
37
+ }
38
+ const scriptPath = match.scriptPath ?? match.script_path;
39
+ const resolvedScriptPath = scriptPath ?? match.files?.script;
40
+ if (!resolvedScriptPath) {
41
+ return null;
42
+ }
43
+ return {
44
+ source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
45
+ name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
46
+ company: match.company,
47
+ description: undefined,
48
+ connectorPath: path.join(connectorCacheDir, resolvedScriptPath),
49
+ version: match.version,
50
+ };
51
+ }
52
+ export async function findCachedConnectorScript(source, connectorCacheDir) {
53
+ const normalizedSource = source.toLowerCase();
54
+ try {
55
+ const entries = await fs.readdir(connectorCacheDir, {
56
+ withFileTypes: true,
57
+ });
58
+ for (const entry of entries) {
59
+ if (!entry.isDirectory())
60
+ continue;
61
+ const companyDir = path.join(connectorCacheDir, entry.name);
62
+ const files = await fs.readdir(companyDir);
63
+ for (const file of files) {
64
+ if (file.endsWith("-playwright.js") &&
65
+ file.replace(/-playwright\.js$/, "").toLowerCase() ===
66
+ normalizedSource) {
67
+ return path.join(companyDir, file);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ // Cache dir may not exist
74
+ }
75
+ return null;
76
+ }
77
+ export async function fetchConnectorToCache(source, connectorCacheDir, dataConnectorsDir, currentVersion) {
78
+ let registry;
79
+ try {
80
+ registry = await loadRegistry(dataConnectorsDir);
81
+ }
82
+ catch (error) {
83
+ // Offline fallback: if currentVersion provided and cache exists, return cached
84
+ if (currentVersion) {
85
+ const cachedPath = await findCachedConnectorScript(source, connectorCacheDir);
86
+ if (cachedPath) {
87
+ return {
88
+ source: normalizeSourceName(source) ?? source,
89
+ name: normalizeSourceName(source) ?? source,
90
+ connectorPath: cachedPath,
91
+ version: currentVersion,
92
+ updated: false,
93
+ };
94
+ }
95
+ }
96
+ throw error;
97
+ }
98
+ const normalizedSource = source.toLowerCase();
99
+ const match = (registry.connectors ?? []).find((entry) => {
100
+ const id = (entry.id ?? "").toLowerCase();
101
+ const name = (entry.name ?? "").toLowerCase();
102
+ const normalizedId = normalizeSourceName(entry.id)?.toLowerCase() ?? "";
103
+ return (id === normalizedSource ||
104
+ name === normalizedSource ||
105
+ normalizedId === normalizedSource ||
106
+ id.includes(normalizedSource) ||
107
+ name.includes(normalizedSource) ||
108
+ normalizedId.includes(normalizedSource));
109
+ });
110
+ if (!match) {
111
+ throw new Error(`No connector is available for ${source} right now.`);
112
+ }
113
+ const scriptRelPath = match.files?.script ?? match.scriptPath ?? match.script_path;
114
+ const metadataRelPath = match.files?.metadata ?? scriptRelPath?.replace(/\.js$/i, ".json");
115
+ if (!scriptRelPath) {
116
+ throw new Error(`Connector metadata for ${source} is missing a script path.`);
117
+ }
118
+ // Version-aware caching: skip download when versions match and file exists
119
+ if (match.version && currentVersion && match.version === currentVersion) {
120
+ const cachedScriptPath = path.join(connectorCacheDir, scriptRelPath);
121
+ try {
122
+ await fs.access(cachedScriptPath);
123
+ return {
124
+ source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
125
+ name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
126
+ company: match.company,
127
+ description: match.description,
128
+ connectorPath: cachedScriptPath,
129
+ version: match.version,
130
+ updated: false,
131
+ };
132
+ }
133
+ catch {
134
+ // File missing despite version match — fall through to download
135
+ }
136
+ }
137
+ await copyOrFetchFile(scriptRelPath, connectorCacheDir, dataConnectorsDir);
138
+ // Verify checksum if one is specified in the registry.
139
+ if (match.checksums?.script) {
140
+ const scriptDest = path.join(connectorCacheDir, scriptRelPath);
141
+ const content = await fs.readFile(scriptDest);
142
+ const hash = crypto.createHash("sha256").update(content).digest("hex");
143
+ const expected = match.checksums.script.replace(/^sha256:/i, "");
144
+ if (hash !== expected) {
145
+ await fs.rm(scriptDest, { force: true });
146
+ throw new Error(`Checksum mismatch for ${source} connector script (expected ${expected}, got ${hash}).`);
147
+ }
148
+ }
149
+ if (metadataRelPath) {
150
+ await copyOrFetchFile(metadataRelPath, connectorCacheDir, dataConnectorsDir).catch(() => {
151
+ // Metadata may not exist for every connector.
152
+ });
153
+ }
154
+ // Cache the icon if available.
155
+ if (match.iconURL) {
156
+ const normalizedSource = normalizeSourceName(match.id ?? match.name ?? source) ?? source;
157
+ const ext = path.extname(new URL(match.iconURL).pathname) || ".png";
158
+ const iconDest = path.join(connectorCacheDir, `${normalizedSource}.icon${ext}`);
159
+ await fetchIcon(match.iconURL, iconDest).catch(() => {
160
+ // Icon download failure is non-fatal.
161
+ });
162
+ }
163
+ return {
164
+ source: normalizeSourceName(match.id ?? match.name ?? source) ?? source,
165
+ name: match.name ?? normalizeSourceName(match.id ?? source) ?? source,
166
+ company: match.company,
167
+ description: match.description,
168
+ connectorPath: path.join(connectorCacheDir, scriptRelPath),
169
+ version: match.version,
170
+ updated: true,
171
+ previousVersion: currentVersion,
172
+ };
173
+ }
174
+ async function loadRegistry(dataConnectorsDir) {
175
+ if (dataConnectorsDir) {
176
+ try {
177
+ const localRegistry = await fs.readFile(path.join(dataConnectorsDir, "registry.json"), "utf8");
178
+ return JSON.parse(localRegistry);
179
+ }
180
+ catch {
181
+ // Fall through to remote fetch.
182
+ }
183
+ }
184
+ const response = await fetch(REGISTRY_URL, {
185
+ headers: { "User-Agent": "vana-cli" },
186
+ });
187
+ if (!response.ok) {
188
+ throw new Error(`Failed to load connector registry: ${response.status}`);
189
+ }
190
+ return (await response.json());
191
+ }
192
+ async function copyOrFetchFile(relativePath, connectorCacheDir, dataConnectorsDir) {
193
+ const destination = path.join(connectorCacheDir, relativePath);
194
+ await fs.mkdir(path.dirname(destination), { recursive: true });
195
+ if (dataConnectorsDir) {
196
+ const localPath = path.join(dataConnectorsDir, relativePath);
197
+ try {
198
+ const content = await fs.readFile(localPath);
199
+ await fs.writeFile(destination, content);
200
+ return;
201
+ }
202
+ catch {
203
+ // Fall through to remote fetch.
204
+ }
205
+ }
206
+ const response = await fetch(`${BASE_URL}/${relativePath}`, {
207
+ headers: { "User-Agent": "vana-cli" },
208
+ });
209
+ if (!response.ok) {
210
+ throw new Error(`Failed to download ${relativePath}: ${response.status}`);
211
+ }
212
+ const content = Buffer.from(await response.arrayBuffer());
213
+ await fs.writeFile(destination, content);
214
+ }
215
+ async function detectAuthMode(entry, dataConnectorsDir) {
216
+ const relativePath = entry.files?.script ?? entry.scriptPath ?? entry.script_path;
217
+ if (!relativePath) {
218
+ return undefined;
219
+ }
220
+ let script = "";
221
+ // Try the connector cache first (most up-to-date after fetch)
222
+ const cacheDir = getConnectorCacheDir();
223
+ try {
224
+ script = await fs.readFile(path.join(cacheDir, relativePath), "utf8");
225
+ }
226
+ catch {
227
+ // Not cached — try local data-connectors checkout
228
+ if (dataConnectorsDir) {
229
+ try {
230
+ script = await fs.readFile(path.join(dataConnectorsDir, relativePath), "utf8");
231
+ }
232
+ catch {
233
+ script = "";
234
+ }
235
+ }
236
+ }
237
+ if (!script) {
238
+ return undefined;
239
+ }
240
+ if (/page\.requestInput\(/.test(script)) {
241
+ return "interactive";
242
+ }
243
+ if (/page\.(showBrowser|promptUser)\(/.test(script)) {
244
+ return "legacy";
245
+ }
246
+ return "automated";
247
+ }
248
+ function normalizeSourceName(source) {
249
+ if (!source) {
250
+ return null;
251
+ }
252
+ return source.replace(/-playwright$/i, "");
253
+ }
254
+ function toAvailableSource(entry) {
255
+ const id = normalizeSourceName(entry.id ?? entry.name);
256
+ if (!id) {
257
+ return null;
258
+ }
259
+ return {
260
+ id,
261
+ name: entry.name ?? id,
262
+ company: entry.company,
263
+ description: entry.description,
264
+ version: entry.version,
265
+ exportFrequency: entry.exportFrequency,
266
+ };
267
+ }
268
+ export async function readCachedConnectorMetadata(source, cacheDir) {
269
+ try {
270
+ const entries = await fs.readdir(cacheDir, { withFileTypes: true });
271
+ for (const entry of entries) {
272
+ if (!entry.isDirectory()) {
273
+ continue;
274
+ }
275
+ const metadataPath = path.join(cacheDir, entry.name, `${source}-playwright.json`);
276
+ try {
277
+ const raw = await fs.readFile(metadataPath, "utf8");
278
+ return JSON.parse(raw);
279
+ }
280
+ catch {
281
+ // Not found in this subdirectory.
282
+ }
283
+ }
284
+ }
285
+ catch {
286
+ // Cache directory may not exist yet.
287
+ }
288
+ return null;
289
+ }
290
+ async function fetchIcon(url, destination) {
291
+ await fs.mkdir(path.dirname(destination), { recursive: true });
292
+ const response = await fetch(url, {
293
+ headers: { "User-Agent": "vana-cli" },
294
+ });
295
+ if (!response.ok) {
296
+ throw new Error(`Failed to download icon: ${response.status}`);
297
+ }
298
+ const content = Buffer.from(await response.arrayBuffer());
299
+ await fs.writeFile(destination, content);
300
+ }
301
+ //# 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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"}