@opendatalabs/connect 0.7.0 → 0.8.1-canary.1188bec

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 (87) hide show
  1. package/README.md +74 -0
  2. package/dist/cli/bin.d.ts +3 -0
  3. package/dist/cli/bin.d.ts.map +1 -0
  4. package/dist/cli/bin.js +7 -0
  5. package/dist/cli/bin.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +567 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/main.d.ts +2 -0
  11. package/dist/cli/main.d.ts.map +1 -0
  12. package/dist/cli/main.js +2 -0
  13. package/dist/cli/main.js.map +1 -0
  14. package/dist/connectors/index.d.ts +2 -0
  15. package/dist/connectors/index.d.ts.map +1 -0
  16. package/dist/connectors/index.js +2 -0
  17. package/dist/connectors/index.js.map +1 -0
  18. package/dist/connectors/registry.d.ts +29 -0
  19. package/dist/connectors/registry.d.ts.map +1 -0
  20. package/dist/connectors/registry.js +134 -0
  21. package/dist/connectors/registry.js.map +1 -0
  22. package/dist/core/cli-types.d.ts +110 -0
  23. package/dist/core/cli-types.d.ts.map +1 -0
  24. package/dist/core/cli-types.js +61 -0
  25. package/dist/core/cli-types.js.map +1 -0
  26. package/dist/core/index.d.ts +3 -0
  27. package/dist/core/index.d.ts.map +1 -1
  28. package/dist/core/index.js +3 -0
  29. package/dist/core/index.js.map +1 -1
  30. package/dist/core/paths.d.ts +8 -0
  31. package/dist/core/paths.d.ts.map +1 -0
  32. package/dist/core/paths.js +25 -0
  33. package/dist/core/paths.js.map +1 -0
  34. package/dist/core/state-store.d.ts +16 -0
  35. package/dist/core/state-store.d.ts.map +1 -0
  36. package/dist/core/state-store.js +23 -0
  37. package/dist/core/state-store.js.map +1 -0
  38. package/dist/core/types.d.ts +4 -0
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/personal-server/index.d.ts +8 -0
  41. package/dist/personal-server/index.d.ts.map +1 -0
  42. package/dist/personal-server/index.js +76 -0
  43. package/dist/personal-server/index.js.map +1 -0
  44. package/dist/react/useVanaData.d.ts +1 -1
  45. package/dist/react/useVanaData.d.ts.map +1 -1
  46. package/dist/react/useVanaData.js +22 -9
  47. package/dist/react/useVanaData.js.map +1 -1
  48. package/dist/runtime/core/contracts.d.ts +62 -0
  49. package/dist/runtime/core/contracts.d.ts.map +1 -0
  50. package/dist/runtime/core/contracts.js +2 -0
  51. package/dist/runtime/core/contracts.js.map +1 -0
  52. package/dist/runtime/core/index.d.ts +2 -0
  53. package/dist/runtime/core/index.d.ts.map +1 -0
  54. package/dist/runtime/core/index.js +2 -0
  55. package/dist/runtime/core/index.js.map +1 -0
  56. package/dist/runtime/index.d.ts +4 -0
  57. package/dist/runtime/index.d.ts.map +1 -0
  58. package/dist/runtime/index.js +3 -0
  59. package/dist/runtime/index.js.map +1 -0
  60. package/dist/runtime/managed-playwright.d.ts +33 -0
  61. package/dist/runtime/managed-playwright.d.ts.map +1 -0
  62. package/dist/runtime/managed-playwright.js +113 -0
  63. package/dist/runtime/managed-playwright.js.map +1 -0
  64. package/dist/runtime/playwright/browser.d.ts +11 -0
  65. package/dist/runtime/playwright/browser.d.ts.map +1 -0
  66. package/dist/runtime/playwright/browser.js +208 -0
  67. package/dist/runtime/playwright/browser.js.map +1 -0
  68. package/dist/runtime/playwright/in-process-run.d.ts +6 -0
  69. package/dist/runtime/playwright/in-process-run.d.ts.map +1 -0
  70. package/dist/runtime/playwright/in-process-run.js +445 -0
  71. package/dist/runtime/playwright/in-process-run.js.map +1 -0
  72. package/dist/runtime/playwright/index.d.ts +3 -0
  73. package/dist/runtime/playwright/index.d.ts.map +1 -0
  74. package/dist/runtime/playwright/index.js +3 -0
  75. package/dist/runtime/playwright/index.js.map +1 -0
  76. package/dist/runtime/repo-paths.d.ts +2 -0
  77. package/dist/runtime/repo-paths.d.ts.map +1 -0
  78. package/dist/runtime/repo-paths.js +36 -0
  79. package/dist/runtime/repo-paths.js.map +1 -0
  80. package/dist/server/config.d.ts +2 -0
  81. package/dist/server/config.d.ts.map +1 -1
  82. package/dist/server/config.js +1 -0
  83. package/dist/server/config.js.map +1 -1
  84. package/dist/server/connect.d.ts.map +1 -1
  85. package/dist/server/connect.js +7 -0
  86. package/dist/server/connect.js.map +1 -1
  87. package/package.json +34 -4
@@ -0,0 +1,208 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import { execSync } from "node:child_process";
5
+ import { chromium } from "playwright";
6
+ const CHROME_PATHS = {
7
+ darwin: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
8
+ win32: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
9
+ linux: "/usr/bin/google-chrome",
10
+ aix: undefined,
11
+ android: undefined,
12
+ freebsd: undefined,
13
+ haiku: undefined,
14
+ openbsd: undefined,
15
+ cygwin: undefined,
16
+ netbsd: undefined,
17
+ sunos: undefined,
18
+ };
19
+ const CHROME_PROFILE_DIRS = {
20
+ darwin: path.join(process.env.HOME || "", "Library", "Application Support", "Google", "Chrome"),
21
+ win32: path.join(process.env.LOCALAPPDATA || "", "Google", "Chrome", "User Data"),
22
+ linux: path.join(process.env.HOME || "", ".config", "google-chrome"),
23
+ aix: undefined,
24
+ android: undefined,
25
+ freebsd: undefined,
26
+ haiku: undefined,
27
+ openbsd: undefined,
28
+ cygwin: undefined,
29
+ netbsd: undefined,
30
+ sunos: undefined,
31
+ };
32
+ export function getBrowserCacheDir() {
33
+ if (process.env.PLAYWRIGHT_BROWSERS_PATH) {
34
+ return process.env.PLAYWRIGHT_BROWSERS_PATH;
35
+ }
36
+ const home = process.env.HOME || process.env.USERPROFILE || "";
37
+ const candidates = [path.join(home, ".dataconnect", "browsers")];
38
+ for (const dir of candidates) {
39
+ if (fs.existsSync(dir)) {
40
+ return dir;
41
+ }
42
+ }
43
+ return candidates[0];
44
+ }
45
+ export function getSystemChromePath() {
46
+ const chromePath = CHROME_PATHS[process.platform];
47
+ if (chromePath && fs.existsSync(chromePath)) {
48
+ return chromePath;
49
+ }
50
+ if (process.platform === "win32") {
51
+ const altPaths = [
52
+ "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
53
+ path.join(process.env.LOCALAPPDATA || "", "Google\\Chrome\\Application\\chrome.exe"),
54
+ "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
55
+ ];
56
+ for (const candidate of altPaths) {
57
+ if (fs.existsSync(candidate)) {
58
+ return candidate;
59
+ }
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ export function getDownloadedChromiumPath() {
65
+ const cacheDir = getBrowserCacheDir();
66
+ if (!fs.existsSync(cacheDir)) {
67
+ return null;
68
+ }
69
+ const chromiumDir = fs
70
+ .readdirSync(cacheDir)
71
+ .find((entry) => entry.startsWith("chromium-") && !entry.includes("headless"));
72
+ if (!chromiumDir) {
73
+ return null;
74
+ }
75
+ const chromiumPath = path.join(cacheDir, chromiumDir);
76
+ const candidates = process.platform === "darwin"
77
+ ? [
78
+ path.join(chromiumPath, "chrome-mac-arm64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"),
79
+ path.join(chromiumPath, "chrome-mac", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"),
80
+ path.join(chromiumPath, "chrome-mac-arm64", "Chromium.app", "Contents", "MacOS", "Chromium"),
81
+ path.join(chromiumPath, "chrome-mac", "Chromium.app", "Contents", "MacOS", "Chromium"),
82
+ ]
83
+ : process.platform === "win32"
84
+ ? [
85
+ path.join(chromiumPath, "chrome-win", "chrome.exe"),
86
+ path.join(chromiumPath, "chrome-win64", "chrome.exe"),
87
+ ]
88
+ : [
89
+ path.join(chromiumPath, "chrome-linux", "chrome"),
90
+ path.join(chromiumPath, "chrome-linux64", "chrome"),
91
+ ];
92
+ for (const candidate of candidates) {
93
+ if (fs.existsSync(candidate)) {
94
+ return candidate;
95
+ }
96
+ }
97
+ return null;
98
+ }
99
+ export function isSystemChrome(browserPath) {
100
+ if (!browserPath) {
101
+ return false;
102
+ }
103
+ const lower = browserPath.toLowerCase();
104
+ if (lower.includes(".databridge") ||
105
+ lower.includes("chromium") ||
106
+ lower.includes("chrome for testing")) {
107
+ return false;
108
+ }
109
+ return true;
110
+ }
111
+ export function getChromeProfileDir(chromeRoot) {
112
+ const localStatePath = path.join(chromeRoot, "Local State");
113
+ if (fs.existsSync(localStatePath)) {
114
+ try {
115
+ const localState = JSON.parse(fs.readFileSync(localStatePath, "utf8"));
116
+ const lastUsed = localState.profile?.last_used;
117
+ if (lastUsed) {
118
+ const profileDir = path.join(chromeRoot, lastUsed);
119
+ if (fs.existsSync(profileDir)) {
120
+ return profileDir;
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Ignore malformed local state and fall back to Default.
126
+ }
127
+ }
128
+ const defaultDir = path.join(chromeRoot, "Default");
129
+ return fs.existsSync(defaultDir) ? defaultDir : null;
130
+ }
131
+ export function importChromeCookies(userDataDir, browserPath) {
132
+ if (!isSystemChrome(browserPath)) {
133
+ return;
134
+ }
135
+ const markerFile = path.join(userDataDir, ".cookies-imported");
136
+ if (fs.existsSync(markerFile)) {
137
+ return;
138
+ }
139
+ const chromeRoot = CHROME_PROFILE_DIRS[process.platform];
140
+ if (!chromeRoot || !fs.existsSync(chromeRoot)) {
141
+ return;
142
+ }
143
+ const sourceProfileDir = getChromeProfileDir(chromeRoot);
144
+ if (!sourceProfileDir) {
145
+ return;
146
+ }
147
+ const sourceCookies = path.join(sourceProfileDir, "Cookies");
148
+ if (!fs.existsSync(sourceCookies)) {
149
+ return;
150
+ }
151
+ const targetCookies = path.join(userDataDir, "Default", "Cookies");
152
+ if (!fs.existsSync(targetCookies)) {
153
+ return;
154
+ }
155
+ const sourceDb = sourceCookies.replace(/'/g, "'\\''");
156
+ const targetDb = targetCookies.replace(/'/g, "'\\''");
157
+ const sql = `
158
+ ATTACH DATABASE '${sourceDb}' AS src;
159
+ INSERT OR REPLACE INTO main.cookies
160
+ SELECT * FROM src.cookies;
161
+ DETACH DATABASE src;
162
+ `;
163
+ try {
164
+ execSync(`sqlite3 '${targetDb}' "${sql.replace(/\n/g, " ")}"`, {
165
+ stdio: "ignore",
166
+ });
167
+ fs.writeFileSync(markerFile, `${new Date().toISOString()}\n`, "utf8");
168
+ }
169
+ catch {
170
+ // Cookie import is opportunistic; continue if sqlite3 is unavailable.
171
+ }
172
+ }
173
+ export function resolveBrowserPath() {
174
+ let browserPath = null;
175
+ if (!process.env.DATACONNECT_SIMULATE_NO_CHROME) {
176
+ browserPath = getSystemChromePath();
177
+ }
178
+ if (!browserPath) {
179
+ browserPath = getDownloadedChromiumPath();
180
+ }
181
+ if (!browserPath) {
182
+ throw new Error("No browser available. Run `vana setup` to install Chromium before connecting a source.");
183
+ }
184
+ return browserPath;
185
+ }
186
+ export async function launchPersistentContext(userDataDir, headless, browserPath) {
187
+ fs.mkdirSync(userDataDir, { recursive: true });
188
+ const launchOptions = {
189
+ headless,
190
+ args: [
191
+ "--disable-blink-features=AutomationControlled",
192
+ "--disable-features=MediaRouter,DialMediaRouteProvider",
193
+ ],
194
+ viewport: { width: 1280, height: 800 },
195
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
196
+ };
197
+ if (browserPath) {
198
+ launchOptions.executablePath = browserPath;
199
+ }
200
+ if (isSystemChrome(browserPath)) {
201
+ launchOptions.ignoreDefaultArgs = ["--use-mock-keychain"];
202
+ }
203
+ return chromium.launchPersistentContext(userDataDir, launchOptions);
204
+ }
205
+ export function getDefaultUserDataDir(slug) {
206
+ return path.join(os.homedir(), ".dataconnect", "browser-profiles", slug);
207
+ }
208
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/runtime/playwright/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AAE3D,MAAM,YAAY,GAAgD;IAChE,MAAM,EAAE,8DAA8D;IACtE,KAAK,EAAE,4DAA4D;IACnE,KAAK,EAAE,wBAAwB;IAC/B,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,mBAAmB,GAAgD;IACvE,MAAM,EAAE,IAAI,CAAC,IAAI,CACf,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EACtB,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,QAAQ,CACT;IACD,KAAK,EAAE,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,EAC9B,QAAQ,EACR,QAAQ,EACR,WAAW,CACZ;IACD,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC;IACpE,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG;YACf,kEAAkE;YAClE,IAAI,CAAC,IAAI,CACP,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,EAC9B,yCAAyC,CAC1C;YACD,mEAAmE;SACpE,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,EAAE;SACnB,WAAW,CAAC,QAAQ,CAAC;SACrB,IAAI,CACH,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CACxE,CAAC;IACJ,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC;YACE,IAAI,CAAC,IAAI,CACP,YAAY,EACZ,kBAAkB,EAClB,+BAA+B,EAC/B,UAAU,EACV,OAAO,EACP,2BAA2B,CAC5B;YACD,IAAI,CAAC,IAAI,CACP,YAAY,EACZ,YAAY,EACZ,+BAA+B,EAC/B,UAAU,EACV,OAAO,EACP,2BAA2B,CAC5B;YACD,IAAI,CAAC,IAAI,CACP,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,OAAO,EACP,UAAU,CACX;YACD,IAAI,CAAC,IAAI,CACP,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,UAAU,EACV,OAAO,EACP,UAAU,CACX;SACF;QACH,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC;gBACE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;gBACnD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;aACtD;YACH,CAAC,CAAC;gBACE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE,QAAQ,CAAC;aACpD,CAAC;IAEV,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,IACE,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1B,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAC3B,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAGxC,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACnD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,WAA0B;IAE1B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG;mBACK,QAAQ;;;;CAI1B,CAAC;IAEA,IAAI,CAAC;QACH,QAAQ,CAAC,YAAY,QAAQ,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE;YAC7D,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;QAChD,WAAW,GAAG,mBAAmB,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,yBAAyB,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,QAAiB,EACjB,WAA0B;IAE1B,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,aAAa,GACjB;QACE,QAAQ;QACR,IAAI,EAAE;YACJ,+CAA+C;YAC/C,uDAAuD;SACxD;QACD,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QACtC,SAAS,EACP,uHAAuH;KAC1H,CAAC;IAEJ,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,cAAc,GAAG,WAAW,CAAC;IAC7C,CAAC;IAED,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,aAAa,CAAC,iBAAiB,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ConnectorRunHandle, ConnectorRunRequest } from "../core/index.js";
2
+ export declare function startInProcessConnectorRun({ request, logPath, }: {
3
+ request: ConnectorRunRequest;
4
+ logPath: string;
5
+ }): ConnectorRunHandle;
6
+ //# sourceMappingURL=in-process-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process-run.d.ts","sourceRoot":"","sources":["../../../src/runtime/playwright/in-process-run.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AA+C1B,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,kBAAkB,CA+LrB"}
@@ -0,0 +1,445 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { ensureParentDir, getLastResultPath } from "../../core/index.js";
6
+ import { getDefaultUserDataDir, importChromeCookies, isSystemChrome, launchPersistentContext, resolveBrowserPath, } from "./browser.js";
7
+ class NeedsInputError extends Error {
8
+ constructor() {
9
+ super("Connector requires additional input.");
10
+ }
11
+ }
12
+ class LegacyAuthError extends Error {
13
+ constructor(method) {
14
+ super(`${method} is not supported by the in-process runtime.`);
15
+ }
16
+ }
17
+ export function startInProcessConnectorRun({ request, logPath, }) {
18
+ const runId = `${path.basename(request.connectorPath, path.extname(request.connectorPath))}-${Date.now()}`;
19
+ const pendingInputPath = path.join(os.homedir(), ".dataconnect", `pending-input-${runId}.json`);
20
+ const responseInputPath = path.join(os.homedir(), ".dataconnect", `input-response-${runId}.json`);
21
+ const logStream = fs.createWriteStream(logPath);
22
+ const queue = [];
23
+ let resolveQueue = null;
24
+ let settled = false;
25
+ let activeContext = null;
26
+ const flushQueue = () => {
27
+ resolveQueue?.();
28
+ resolveQueue = null;
29
+ };
30
+ const pushEvent = (event) => {
31
+ queue.push(event);
32
+ flushQueue();
33
+ };
34
+ const writeLog = (message) => {
35
+ logStream.write(`${message}\n`);
36
+ };
37
+ const runPromise = (async () => {
38
+ pushEvent({
39
+ type: "run-started",
40
+ source: request.source,
41
+ logPath,
42
+ });
43
+ const slug = path.basename(request.connectorPath, path.extname(request.connectorPath));
44
+ const runState = {
45
+ context: null,
46
+ page: null,
47
+ userDataDir: getDefaultUserDataDir(slug),
48
+ browserPath: null,
49
+ browserClosed: false,
50
+ browserClosedByConnector: false,
51
+ connectorCompleted: false,
52
+ headless: true,
53
+ allowHeaded: false,
54
+ hasResult: false,
55
+ cookies: [],
56
+ };
57
+ if (request.signal) {
58
+ request.signal.addEventListener("abort", () => {
59
+ void runState.context?.close().catch(() => { });
60
+ });
61
+ }
62
+ try {
63
+ const connectorCode = await fsp.readFile(request.connectorPath, "utf8");
64
+ runState.browserPath = resolveBrowserPath();
65
+ writeLog(`[runtime] Using browser: ${runState.browserPath}`);
66
+ const markerFile = path.join(runState.userDataDir, ".cookies-imported");
67
+ if (isSystemChrome(runState.browserPath) && !fs.existsSync(markerFile)) {
68
+ writeLog("[runtime] Initializing browser profile before cookie import");
69
+ const tempContext = await launchPersistentContext(runState.userDataDir, true, runState.browserPath);
70
+ await tempContext.close();
71
+ importChromeCookies(runState.userDataDir, runState.browserPath);
72
+ }
73
+ const context = await launchPersistentContext(runState.userDataDir, true, runState.browserPath);
74
+ activeContext = context;
75
+ const page = context.pages()[0] || (await context.newPage());
76
+ runState.context = context;
77
+ runState.page = page;
78
+ context.browser()?.on("disconnected", () => {
79
+ runState.browserClosed = true;
80
+ runState.context = null;
81
+ runState.page = null;
82
+ if (!runState.connectorCompleted &&
83
+ !runState.browserClosedByConnector) {
84
+ pushEvent({
85
+ type: "runtime-error",
86
+ source: request.source,
87
+ message: "Browser session ended before the connector completed.",
88
+ logPath,
89
+ });
90
+ }
91
+ });
92
+ const pageApi = createPageApi({
93
+ request,
94
+ runState,
95
+ logPath,
96
+ pendingInputPath,
97
+ responseInputPath,
98
+ pushEvent,
99
+ writeLog,
100
+ });
101
+ await page.goto("about:blank", { waitUntil: "domcontentloaded" });
102
+ const connectorFunction = buildConnectorFunction(connectorCode);
103
+ const result = await connectorFunction.call(null, pageApi);
104
+ if (!runState.hasResult && result != null) {
105
+ const exportData = result &&
106
+ typeof result === "object" &&
107
+ "success" in result &&
108
+ "data" in result
109
+ ? result.data
110
+ : result;
111
+ const resultPath = getLastResultPath();
112
+ await ensureParentDir(resultPath);
113
+ await fsp.writeFile(resultPath, `${JSON.stringify(exportData, null, 2)}\n`, "utf8");
114
+ pushEvent({
115
+ type: "collection-complete",
116
+ source: request.source,
117
+ resultPath,
118
+ logPath,
119
+ });
120
+ }
121
+ runState.connectorCompleted = true;
122
+ if (!runState.browserClosed && runState.context) {
123
+ await runState.context.close().catch(() => { });
124
+ }
125
+ }
126
+ catch (error) {
127
+ if (error instanceof NeedsInputError) {
128
+ return;
129
+ }
130
+ pushEvent(classifyRuntimeError(error, request.source, logPath));
131
+ }
132
+ finally {
133
+ settled = true;
134
+ await activeContext?.close().catch(() => { });
135
+ logStream.end();
136
+ flushQueue();
137
+ }
138
+ })();
139
+ return {
140
+ source: request.source,
141
+ logPath,
142
+ async *events() {
143
+ while (!settled || queue.length > 0) {
144
+ if (queue.length === 0) {
145
+ await new Promise((resolve) => {
146
+ resolveQueue = resolve;
147
+ });
148
+ continue;
149
+ }
150
+ yield queue.shift();
151
+ }
152
+ await runPromise;
153
+ },
154
+ stop() {
155
+ void activeContext?.close().catch(() => { });
156
+ if (!settled) {
157
+ pushEvent({
158
+ type: "runtime-error",
159
+ source: request.source,
160
+ message: "Connector run stopped.",
161
+ logPath,
162
+ });
163
+ }
164
+ },
165
+ };
166
+ }
167
+ function buildConnectorFunction(connectorCode) {
168
+ let modifiedCode = connectorCode;
169
+ const iifePattern = /\n\(async\s*\(\)\s*=>\s*\{/g;
170
+ const matches = [...modifiedCode.matchAll(iifePattern)];
171
+ if (matches.length > 0) {
172
+ const lastMatch = matches[matches.length - 1];
173
+ modifiedCode =
174
+ modifiedCode.slice(0, lastMatch.index) +
175
+ "\nreturn (async () => {" +
176
+ modifiedCode.slice(lastMatch.index + lastMatch[0].length);
177
+ }
178
+ const AsyncFunction = Object.getPrototypeOf(async function () { })
179
+ .constructor;
180
+ return new AsyncFunction("page", modifiedCode);
181
+ }
182
+ function createPageApi({ request, runState, logPath, pendingInputPath, responseInputPath, pushEvent, writeLog, }) {
183
+ const networkCaptures = new Map();
184
+ const capturedResponses = new Map();
185
+ function requirePage() {
186
+ if (runState.browserClosed || !runState.page) {
187
+ throw new Error("Browser is closed. Use page.httpFetch() for HTTP requests.");
188
+ }
189
+ return runState.page;
190
+ }
191
+ function setupNetworkCapture(page) {
192
+ page.on("response", async (response) => {
193
+ const url = response.url();
194
+ for (const [key, config] of networkCaptures.entries()) {
195
+ if (config.urlPattern && !url.includes(config.urlPattern)) {
196
+ continue;
197
+ }
198
+ try {
199
+ const request = response.request();
200
+ const postData = request.postData() || "";
201
+ if (config.bodyPattern) {
202
+ const patterns = config.bodyPattern.split("|");
203
+ if (!patterns.some((pattern) => postData.includes(pattern))) {
204
+ continue;
205
+ }
206
+ }
207
+ const body = await response.json().catch(() => null);
208
+ if (body) {
209
+ capturedResponses.set(key, {
210
+ url,
211
+ data: body,
212
+ timestamp: Date.now(),
213
+ });
214
+ writeLog(`[network] captured ${key} from ${url}`);
215
+ }
216
+ }
217
+ catch {
218
+ // Ignore non-JSON responses.
219
+ }
220
+ }
221
+ });
222
+ }
223
+ if (runState.page) {
224
+ setupNetworkCapture(runState.page);
225
+ }
226
+ return {
227
+ goto: async (url, options = {}) => {
228
+ const page = requirePage();
229
+ const gotoOptions = {
230
+ waitUntil: options.waitUntil ?? "domcontentloaded",
231
+ };
232
+ if (options.timeout != null) {
233
+ gotoOptions.timeout = options.timeout;
234
+ }
235
+ writeLog(`[page] goto ${url}`);
236
+ await page.goto(url, gotoOptions);
237
+ },
238
+ evaluate: async (script) => {
239
+ return requirePage().evaluate(script);
240
+ },
241
+ screenshot: async () => {
242
+ const buffer = await requirePage().screenshot({
243
+ type: "jpeg",
244
+ quality: 70,
245
+ timeout: 5000,
246
+ });
247
+ return buffer.toString("base64");
248
+ },
249
+ requestInput: async (payload) => {
250
+ const fields = Object.keys(payload.schema?.properties ?? {});
251
+ const inputRequest = {
252
+ message: payload.message ?? "Additional input is required.",
253
+ schema: payload.schema,
254
+ fields,
255
+ responseInputPath,
256
+ };
257
+ if (request.noInput || !request.onNeedInput) {
258
+ await writePendingInput({
259
+ pendingInputPath,
260
+ responseInputPath,
261
+ message: inputRequest.message ?? "Additional input is required.",
262
+ schema: inputRequest.schema,
263
+ });
264
+ pushEvent({
265
+ type: "needs-input",
266
+ source: request.source,
267
+ message: inputRequest.message ?? "Additional input is required.",
268
+ fields: inputRequest.fields,
269
+ schema: inputRequest.schema,
270
+ responseInputPath,
271
+ logPath,
272
+ });
273
+ throw new NeedsInputError();
274
+ }
275
+ const input = await request.onNeedInput(inputRequest);
276
+ await ensureParentDir(responseInputPath);
277
+ await fsp.writeFile(responseInputPath, `${JSON.stringify(input)}\n`, "utf8");
278
+ await fsp.rm(pendingInputPath, { force: true });
279
+ return input;
280
+ },
281
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
282
+ setData: async (key, value) => {
283
+ if (key === "result") {
284
+ runState.hasResult = true;
285
+ }
286
+ writeLog(`[data] ${key}=${typeof value === "string" ? value : JSON.stringify(value)}`);
287
+ },
288
+ setProgress: async ({ phase, message, count, }) => {
289
+ writeLog(`[progress] ${JSON.stringify({
290
+ phase,
291
+ message,
292
+ count,
293
+ })}`);
294
+ },
295
+ promptUser: async (message, checkFn, interval = 2000) => {
296
+ writeLog(`[prompt] ${message}`);
297
+ void checkFn;
298
+ void interval;
299
+ throw new LegacyAuthError("promptUser");
300
+ },
301
+ captureNetwork: async (config) => {
302
+ networkCaptures.set(config.key, {
303
+ urlPattern: config.urlPattern || "",
304
+ bodyPattern: config.bodyPattern || "",
305
+ });
306
+ },
307
+ getCapturedResponse: async (key) => {
308
+ return capturedResponses.get(key) ?? null;
309
+ },
310
+ clearNetworkCaptures: async () => {
311
+ networkCaptures.clear();
312
+ capturedResponses.clear();
313
+ },
314
+ hasCapturedResponse: (key) => capturedResponses.has(key),
315
+ closeBrowser: async () => {
316
+ if (runState.browserClosed) {
317
+ return;
318
+ }
319
+ if (runState.context) {
320
+ try {
321
+ runState.cookies = await runState.context.cookies();
322
+ }
323
+ catch {
324
+ runState.cookies = [];
325
+ }
326
+ }
327
+ runState.browserClosed = true;
328
+ runState.browserClosedByConnector = true;
329
+ await runState.context?.close().catch(() => { });
330
+ runState.context = null;
331
+ runState.page = null;
332
+ writeLog("[browser] closed by connector");
333
+ },
334
+ showBrowser: async (url) => {
335
+ void url;
336
+ throw new LegacyAuthError("showBrowser");
337
+ },
338
+ goHeadless: async () => {
339
+ runState.browserClosedByConnector = true;
340
+ await runState.context?.close().catch(() => { });
341
+ runState.context = await launchPersistentContext(runState.userDataDir, true, runState.browserPath);
342
+ runState.page =
343
+ runState.context.pages()[0] || (await runState.context.newPage());
344
+ runState.browserClosed = false;
345
+ runState.browserClosedByConnector = false;
346
+ runState.headless = true;
347
+ if (runState.page) {
348
+ setupNetworkCapture(runState.page);
349
+ await runState.page.goto("https://chatgpt.com/", {
350
+ waitUntil: "domcontentloaded",
351
+ });
352
+ }
353
+ },
354
+ httpFetch: async (url, options = {}) => {
355
+ const { timeout = 30000, ...fetchOptions } = options;
356
+ if (runState.cookies.length > 0) {
357
+ try {
358
+ const urlObject = new URL(url);
359
+ const relevantCookies = runState.cookies
360
+ .filter((cookie) => {
361
+ const cookieDomain = cookie.domain.startsWith(".")
362
+ ? cookie.domain.slice(1)
363
+ : cookie.domain;
364
+ return (urlObject.hostname === cookieDomain ||
365
+ urlObject.hostname.endsWith(`.${cookieDomain}`));
366
+ })
367
+ .map((cookie) => `${cookie.name}=${cookie.value}`)
368
+ .join("; ");
369
+ if (relevantCookies) {
370
+ fetchOptions.headers = {
371
+ ...(fetchOptions.headers || {}),
372
+ cookie: relevantCookies,
373
+ };
374
+ }
375
+ }
376
+ catch {
377
+ // Ignore cookie injection failures.
378
+ }
379
+ }
380
+ const controller = new AbortController();
381
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
382
+ try {
383
+ const response = await fetch(url, {
384
+ ...fetchOptions,
385
+ signal: controller.signal,
386
+ });
387
+ clearTimeout(timeoutId);
388
+ const text = await response.text();
389
+ let json = null;
390
+ try {
391
+ json = JSON.parse(text);
392
+ }
393
+ catch {
394
+ json = null;
395
+ }
396
+ return {
397
+ ok: response.ok,
398
+ status: response.status,
399
+ headers: Object.fromEntries(response.headers.entries()),
400
+ text,
401
+ json,
402
+ error: null,
403
+ };
404
+ }
405
+ catch (error) {
406
+ clearTimeout(timeoutId);
407
+ return {
408
+ ok: false,
409
+ status: 0,
410
+ headers: {},
411
+ text: "",
412
+ json: null,
413
+ error: error instanceof Error ? error.message : String(error),
414
+ };
415
+ }
416
+ },
417
+ };
418
+ }
419
+ function classifyRuntimeError(error, source, logPath) {
420
+ const message = error instanceof Error ? error.message : String(error);
421
+ if (message.includes("showBrowser") || message.includes("promptUser")) {
422
+ return {
423
+ type: "legacy-auth",
424
+ source,
425
+ message: "This connector uses legacy authentication (showBrowser/promptUser) which is not supported in batch mode. Either use a migrated connector that supports requestInput, or establish a session manually first.",
426
+ logPath,
427
+ };
428
+ }
429
+ return {
430
+ type: "runtime-error",
431
+ source,
432
+ message,
433
+ logPath,
434
+ };
435
+ }
436
+ async function writePendingInput({ pendingInputPath, responseInputPath, message, schema, }) {
437
+ await ensureParentDir(pendingInputPath);
438
+ await fsp.writeFile(pendingInputPath, `${JSON.stringify({
439
+ message,
440
+ schema: schema ?? {},
441
+ responseInputPath,
442
+ timestamp: new Date().toISOString(),
443
+ }, null, 2)}\n`, "utf8");
444
+ }
445
+ //# sourceMappingURL=in-process-run.js.map