@monoes/monobrowse 1.0.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 (208) hide show
  1. package/dist/src/browser/action-builder/analyzer.d.ts +11 -0
  2. package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -0
  3. package/dist/src/browser/action-builder/analyzer.js +93 -0
  4. package/dist/src/browser/action-builder/analyzer.js.map +1 -0
  5. package/dist/src/browser/action-builder/types.d.ts +46 -0
  6. package/dist/src/browser/action-builder/types.d.ts.map +1 -0
  7. package/dist/src/browser/action-builder/types.js +2 -0
  8. package/dist/src/browser/action-builder/types.js.map +1 -0
  9. package/dist/src/browser/actions.d.ts +29 -0
  10. package/dist/src/browser/actions.d.ts.map +1 -0
  11. package/dist/src/browser/actions.js +398 -0
  12. package/dist/src/browser/actions.js.map +1 -0
  13. package/dist/src/browser/adapters/gemini.d.ts +3 -0
  14. package/dist/src/browser/adapters/gemini.d.ts.map +1 -0
  15. package/dist/src/browser/adapters/gemini.js +13 -0
  16. package/dist/src/browser/adapters/gemini.js.map +1 -0
  17. package/dist/src/browser/adapters/google.d.ts +3 -0
  18. package/dist/src/browser/adapters/google.d.ts.map +1 -0
  19. package/dist/src/browser/adapters/google.js +17 -0
  20. package/dist/src/browser/adapters/google.js.map +1 -0
  21. package/dist/src/browser/adapters/index.d.ts +15 -0
  22. package/dist/src/browser/adapters/index.d.ts.map +1 -0
  23. package/dist/src/browser/adapters/index.js +18 -0
  24. package/dist/src/browser/adapters/index.js.map +1 -0
  25. package/dist/src/browser/adapters/instagram.d.ts +3 -0
  26. package/dist/src/browser/adapters/instagram.d.ts.map +1 -0
  27. package/dist/src/browser/adapters/instagram.js +14 -0
  28. package/dist/src/browser/adapters/instagram.js.map +1 -0
  29. package/dist/src/browser/adapters/linkedin.d.ts +3 -0
  30. package/dist/src/browser/adapters/linkedin.d.ts.map +1 -0
  31. package/dist/src/browser/adapters/linkedin.js +13 -0
  32. package/dist/src/browser/adapters/linkedin.js.map +1 -0
  33. package/dist/src/browser/adapters/microsoft.d.ts +3 -0
  34. package/dist/src/browser/adapters/microsoft.d.ts.map +1 -0
  35. package/dist/src/browser/adapters/microsoft.js +16 -0
  36. package/dist/src/browser/adapters/microsoft.js.map +1 -0
  37. package/dist/src/browser/adapters/x.d.ts +3 -0
  38. package/dist/src/browser/adapters/x.d.ts.map +1 -0
  39. package/dist/src/browser/adapters/x.js +13 -0
  40. package/dist/src/browser/adapters/x.js.map +1 -0
  41. package/dist/src/browser/batch.d.ts +5 -0
  42. package/dist/src/browser/batch.d.ts.map +1 -0
  43. package/dist/src/browser/batch.js +2 -0
  44. package/dist/src/browser/batch.js.map +1 -0
  45. package/dist/src/browser/browser.d.ts +15 -0
  46. package/dist/src/browser/browser.d.ts.map +1 -0
  47. package/dist/src/browser/browser.js +256 -0
  48. package/dist/src/browser/browser.js.map +1 -0
  49. package/dist/src/browser/cdp.d.ts +18 -0
  50. package/dist/src/browser/cdp.d.ts.map +1 -0
  51. package/dist/src/browser/cdp.js +153 -0
  52. package/dist/src/browser/cdp.js.map +1 -0
  53. package/dist/src/browser/console-log.d.ts +23 -0
  54. package/dist/src/browser/console-log.d.ts.map +1 -0
  55. package/dist/src/browser/console-log.js +104 -0
  56. package/dist/src/browser/console-log.js.map +1 -0
  57. package/dist/src/browser/dashboard/api-types.d.ts +50 -0
  58. package/dist/src/browser/dashboard/api-types.d.ts.map +1 -0
  59. package/dist/src/browser/dashboard/api-types.js +14 -0
  60. package/dist/src/browser/dashboard/api-types.js.map +1 -0
  61. package/dist/src/browser/dashboard/server.d.ts +11 -0
  62. package/dist/src/browser/dashboard/server.d.ts.map +1 -0
  63. package/dist/src/browser/dashboard/server.js +191 -0
  64. package/dist/src/browser/dashboard/server.js.map +1 -0
  65. package/dist/src/browser/dialog.d.ts +12 -0
  66. package/dist/src/browser/dialog.d.ts.map +1 -0
  67. package/dist/src/browser/dialog.js +53 -0
  68. package/dist/src/browser/dialog.js.map +1 -0
  69. package/dist/src/browser/emulation.d.ts +15 -0
  70. package/dist/src/browser/emulation.d.ts.map +1 -0
  71. package/dist/src/browser/emulation.js +62 -0
  72. package/dist/src/browser/emulation.js.map +1 -0
  73. package/dist/src/browser/find.d.ts +22 -0
  74. package/dist/src/browser/find.d.ts.map +1 -0
  75. package/dist/src/browser/find.js +169 -0
  76. package/dist/src/browser/find.js.map +1 -0
  77. package/dist/src/browser/har.d.ts +27 -0
  78. package/dist/src/browser/har.d.ts.map +1 -0
  79. package/dist/src/browser/har.js +161 -0
  80. package/dist/src/browser/har.js.map +1 -0
  81. package/dist/src/browser/index.d.ts +23 -0
  82. package/dist/src/browser/index.d.ts.map +1 -0
  83. package/dist/src/browser/index.js +23 -0
  84. package/dist/src/browser/index.js.map +1 -0
  85. package/dist/src/browser/network.d.ts +32 -0
  86. package/dist/src/browser/network.d.ts.map +1 -0
  87. package/dist/src/browser/network.js +214 -0
  88. package/dist/src/browser/network.js.map +1 -0
  89. package/dist/src/browser/pdf.d.ts +15 -0
  90. package/dist/src/browser/pdf.d.ts.map +1 -0
  91. package/dist/src/browser/pdf.js +27 -0
  92. package/dist/src/browser/pdf.js.map +1 -0
  93. package/dist/src/browser/profiler.d.ts +10 -0
  94. package/dist/src/browser/profiler.d.ts.map +1 -0
  95. package/dist/src/browser/profiler.js +77 -0
  96. package/dist/src/browser/profiler.js.map +1 -0
  97. package/dist/src/browser/record.d.ts +21 -0
  98. package/dist/src/browser/record.d.ts.map +1 -0
  99. package/dist/src/browser/record.js +59 -0
  100. package/dist/src/browser/record.js.map +1 -0
  101. package/dist/src/browser/screenshot.d.ts +15 -0
  102. package/dist/src/browser/screenshot.d.ts.map +1 -0
  103. package/dist/src/browser/screenshot.js +38 -0
  104. package/dist/src/browser/screenshot.js.map +1 -0
  105. package/dist/src/browser/session.d.ts +8 -0
  106. package/dist/src/browser/session.d.ts.map +1 -0
  107. package/dist/src/browser/session.js +91 -0
  108. package/dist/src/browser/session.js.map +1 -0
  109. package/dist/src/browser/snapshot.d.ts +12 -0
  110. package/dist/src/browser/snapshot.d.ts.map +1 -0
  111. package/dist/src/browser/snapshot.js +179 -0
  112. package/dist/src/browser/snapshot.js.map +1 -0
  113. package/dist/src/browser/storage.d.ts +12 -0
  114. package/dist/src/browser/storage.d.ts.map +1 -0
  115. package/dist/src/browser/storage.js +46 -0
  116. package/dist/src/browser/storage.js.map +1 -0
  117. package/dist/src/browser/tabs.d.ts +8 -0
  118. package/dist/src/browser/tabs.d.ts.map +1 -0
  119. package/dist/src/browser/tabs.js +25 -0
  120. package/dist/src/browser/tabs.js.map +1 -0
  121. package/dist/src/browser/trace.d.ts +10 -0
  122. package/dist/src/browser/trace.d.ts.map +1 -0
  123. package/dist/src/browser/trace.js +87 -0
  124. package/dist/src/browser/trace.js.map +1 -0
  125. package/dist/src/browser/types.d.ts +111 -0
  126. package/dist/src/browser/types.d.ts.map +1 -0
  127. package/dist/src/browser/types.js +16 -0
  128. package/dist/src/browser/types.js.map +1 -0
  129. package/dist/src/browser/vitals.d.ts +15 -0
  130. package/dist/src/browser/vitals.d.ts.map +1 -0
  131. package/dist/src/browser/vitals.js +116 -0
  132. package/dist/src/browser/vitals.js.map +1 -0
  133. package/dist/src/browser/wait.d.ts +4 -0
  134. package/dist/src/browser/wait.d.ts.map +1 -0
  135. package/dist/src/browser/wait.js +146 -0
  136. package/dist/src/browser/wait.js.map +1 -0
  137. package/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
  138. package/dist/src/browser/workflow/builtin-handlers.d.ts.map +1 -0
  139. package/dist/src/browser/workflow/builtin-handlers.js +343 -0
  140. package/dist/src/browser/workflow/builtin-handlers.js.map +1 -0
  141. package/dist/src/browser/workflow/engine.d.ts +10 -0
  142. package/dist/src/browser/workflow/engine.d.ts.map +1 -0
  143. package/dist/src/browser/workflow/engine.js +174 -0
  144. package/dist/src/browser/workflow/engine.js.map +1 -0
  145. package/dist/src/browser/workflow/expression.d.ts +4 -0
  146. package/dist/src/browser/workflow/expression.d.ts.map +1 -0
  147. package/dist/src/browser/workflow/expression.js +89 -0
  148. package/dist/src/browser/workflow/expression.js.map +1 -0
  149. package/dist/src/browser/workflow/index.d.ts +6 -0
  150. package/dist/src/browser/workflow/index.d.ts.map +1 -0
  151. package/dist/src/browser/workflow/index.js +6 -0
  152. package/dist/src/browser/workflow/index.js.map +1 -0
  153. package/dist/src/browser/workflow/store.d.ts +8 -0
  154. package/dist/src/browser/workflow/store.d.ts.map +1 -0
  155. package/dist/src/browser/workflow/store.js +87 -0
  156. package/dist/src/browser/workflow/store.js.map +1 -0
  157. package/dist/src/browser/workflow/types.d.ts +62 -0
  158. package/dist/src/browser/workflow/types.d.ts.map +1 -0
  159. package/dist/src/browser/workflow/types.js +2 -0
  160. package/dist/src/browser/workflow/types.js.map +1 -0
  161. package/dist/src/index.d.ts +7 -0
  162. package/dist/src/index.d.ts.map +1 -0
  163. package/dist/src/index.js +7 -0
  164. package/dist/src/index.js.map +1 -0
  165. package/dist/tsconfig.tsbuildinfo +1 -0
  166. package/package.json +56 -0
  167. package/src/browser/action-builder/analyzer.ts +127 -0
  168. package/src/browser/action-builder/types.ts +17 -0
  169. package/src/browser/actions.ts +518 -0
  170. package/src/browser/adapters/gemini.ts +15 -0
  171. package/src/browser/adapters/google.ts +20 -0
  172. package/src/browser/adapters/index.ts +33 -0
  173. package/src/browser/adapters/instagram.ts +16 -0
  174. package/src/browser/adapters/linkedin.ts +15 -0
  175. package/src/browser/adapters/microsoft.ts +19 -0
  176. package/src/browser/adapters/x.ts +15 -0
  177. package/src/browser/batch.ts +4 -0
  178. package/src/browser/browser.ts +265 -0
  179. package/src/browser/cdp.ts +156 -0
  180. package/src/browser/console-log.ts +120 -0
  181. package/src/browser/dashboard/api-types.ts +71 -0
  182. package/src/browser/dashboard/server.ts +206 -0
  183. package/src/browser/dashboard/ui.html +444 -0
  184. package/src/browser/dialog.ts +63 -0
  185. package/src/browser/emulation.ts +94 -0
  186. package/src/browser/find.ts +225 -0
  187. package/src/browser/har.ts +202 -0
  188. package/src/browser/index.ts +22 -0
  189. package/src/browser/network.ts +244 -0
  190. package/src/browser/pdf.ts +41 -0
  191. package/src/browser/profiler.ts +96 -0
  192. package/src/browser/record.ts +92 -0
  193. package/src/browser/screenshot.ts +67 -0
  194. package/src/browser/session.ts +118 -0
  195. package/src/browser/snapshot.ts +248 -0
  196. package/src/browser/storage.ts +54 -0
  197. package/src/browser/tabs.ts +37 -0
  198. package/src/browser/trace.ts +106 -0
  199. package/src/browser/types.ts +135 -0
  200. package/src/browser/vitals.ts +122 -0
  201. package/src/browser/wait.ts +178 -0
  202. package/src/browser/workflow/builtin-handlers.ts +379 -0
  203. package/src/browser/workflow/engine.ts +202 -0
  204. package/src/browser/workflow/expression.ts +107 -0
  205. package/src/browser/workflow/index.ts +5 -0
  206. package/src/browser/workflow/store.ts +87 -0
  207. package/src/browser/workflow/types.ts +62 -0
  208. package/src/index.ts +6 -0
@@ -0,0 +1,343 @@
1
+ // Built-in node handlers registered for every `browse workflow run` invocation.
2
+ //
3
+ // action.http — fetch a URL (GET/POST/etc.) and put the response in item.data
4
+ // action.save_file — write item data or binaryBase64 to a file on disk
5
+ // action.log — console.log each item (useful for debugging workflows)
6
+ // action.gemini_image — generate image via Gemini web app (browser automation + session store)
7
+ // or Imagen REST API (GEMINI_API_KEY), or mock mode
8
+ import { writeFile, readFile, mkdir, chmod } from 'node:fs/promises';
9
+ import { existsSync } from 'node:fs';
10
+ import { dirname, join, resolve } from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ /** Resolve a user-supplied path and assert it stays within the working directory. */
13
+ function safeResolvePath(rawPath) {
14
+ const cwd = process.cwd();
15
+ const safePath = resolve(cwd, rawPath);
16
+ if (safePath !== cwd && !safePath.startsWith(cwd + '/')) {
17
+ throw new Error(`Path traversal blocked: "${rawPath}" resolves outside working directory`);
18
+ }
19
+ return safePath;
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // Session persistence (shared format with browse-platform.ts)
23
+ // ---------------------------------------------------------------------------
24
+ const SESSIONS_FILE = join(homedir(), '.monomind', 'sessions.json');
25
+ async function loadStoredSession(platform) {
26
+ if (!existsSync(SESSIONS_FILE))
27
+ return null;
28
+ try {
29
+ const sessions = JSON.parse(await readFile(SESSIONS_FILE, 'utf-8'));
30
+ return sessions.find(s => s.platform === platform) ?? null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function saveStoredSession(platform, cookies, userAgent, username) {
37
+ let sessions = [];
38
+ if (existsSync(SESSIONS_FILE)) {
39
+ try {
40
+ sessions = JSON.parse(await readFile(SESSIONS_FILE, 'utf-8'));
41
+ }
42
+ catch { /* start fresh */ }
43
+ }
44
+ const id = `${platform}:${username}`;
45
+ const now = Date.now();
46
+ const existing = sessions.findIndex(s => s.platform === platform);
47
+ const entry = {
48
+ id, platform, username, userAgent,
49
+ cookies: JSON.stringify(cookies),
50
+ createdAt: existing >= 0 ? sessions[existing].createdAt : now,
51
+ lastUsedAt: now,
52
+ };
53
+ if (existing >= 0)
54
+ sessions[existing] = entry;
55
+ else
56
+ sessions.push(entry);
57
+ await mkdir(join(homedir(), '.monomind'), { recursive: true });
58
+ await writeFile(SESSIONS_FILE, JSON.stringify(sessions, null, 2));
59
+ await chmod(SESSIONS_FILE, 0o600);
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Gemini browser automation
63
+ // ---------------------------------------------------------------------------
64
+ const GEMINI_IMAGE_CHECK = `
65
+ (() => {
66
+ const imgs = Array.from(document.querySelectorAll('img'));
67
+ return imgs.some(img =>
68
+ img.complete && img.naturalWidth > 200 && img.naturalHeight > 200 &&
69
+ img.src && !img.src.includes('icon') && !img.src.includes('avatar') &&
70
+ !img.src.includes('logo') && !img.src.includes('profile')
71
+ );
72
+ })()
73
+ `;
74
+ const GEMINI_IMAGE_SRC = `
75
+ (() => {
76
+ const imgs = Array.from(document.querySelectorAll('img'));
77
+ const c = imgs.filter(img =>
78
+ img.complete && img.naturalWidth > 200 && img.naturalHeight > 200 &&
79
+ img.src && !img.src.includes('icon') && !img.src.includes('avatar') &&
80
+ !img.src.includes('logo') && !img.src.includes('profile')
81
+ );
82
+ return c.length ? c[c.length - 1].src : '';
83
+ })()
84
+ `;
85
+ // Generate an image via the Gemini web app, with session management.
86
+ // Flow: connect → restore saved session → if not logged in, wait for user login → generate.
87
+ // Returns the saved file path, or null if Chrome is not available.
88
+ async function generateViaGeminiBrowser(prompt, outputPath, cdpPort) {
89
+ let browser;
90
+ try {
91
+ browser = await import('../index.js');
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ let conn;
97
+ try {
98
+ conn = await browser.connectToTarget(cdpPort);
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ const { client, sessionId } = conn;
104
+ const refs = new Map();
105
+ try {
106
+ // Restore stored Gemini session cookies before navigating
107
+ const stored = await loadStoredSession('gemini');
108
+ if (stored?.cookies) {
109
+ try {
110
+ const cookies = JSON.parse(stored.cookies);
111
+ if (cookies.length > 0) {
112
+ await browser.setCookies(client, sessionId, cookies);
113
+ }
114
+ }
115
+ catch { /* ignore malformed cookies */ }
116
+ }
117
+ // Navigate to Gemini
118
+ await browser.openUrl(client, sessionId, 'https://gemini.google.com/app');
119
+ // Dismiss cookie consent if present
120
+ const refs2 = new Map();
121
+ const consentBtn = await browser.findByRole(client, sessionId, refs2, 'button', { name: 'Accept all' }).catch(() => null);
122
+ if (consentBtn) {
123
+ await browser.clickElement(client, sessionId, consentBtn);
124
+ await new Promise(r => setTimeout(r, 1500));
125
+ }
126
+ // Check if logged in — .ql-editor only appears when authenticated
127
+ let inputRef = await browser.findBySelector(client, sessionId, refs, '.ql-editor').catch(() => null);
128
+ if (!inputRef) {
129
+ // Not logged in — ask the user to authenticate
130
+ console.log('');
131
+ console.log('┌─────────────────────────────────────────────────────────┐');
132
+ console.log('│ Gemini login required │');
133
+ console.log('│ │');
134
+ console.log('│ A browser window has been opened to Gemini. │');
135
+ console.log('│ Please sign in with your Google account. │');
136
+ console.log('│ │');
137
+ console.log('│ The workflow will resume automatically after login. │');
138
+ console.log('│ Waiting up to 5 minutes… │');
139
+ console.log('└─────────────────────────────────────────────────────────┘');
140
+ console.log('');
141
+ // Navigate to Google sign-in
142
+ await browser.openUrl(client, sessionId, 'https://accounts.google.com/signin/v2/identifier');
143
+ // Wait up to 5 min for the user to complete login and land back on Gemini
144
+ const loginDeadline = Date.now() + 5 * 60 * 1000;
145
+ let loggedIn = false;
146
+ while (Date.now() < loginDeadline) {
147
+ await new Promise(r => setTimeout(r, 2000));
148
+ const url = await browser.getCurrentUrl(client, sessionId).catch(() => '');
149
+ if (url.includes('gemini.google.com')) {
150
+ inputRef = await browser.findBySelector(client, sessionId, refs, '.ql-editor').catch(() => null);
151
+ if (inputRef) {
152
+ loggedIn = true;
153
+ break;
154
+ }
155
+ }
156
+ }
157
+ if (!loggedIn) {
158
+ console.log('[action.gemini_image] Login timeout. Run: monomind browse platform connect gemini');
159
+ return null;
160
+ }
161
+ console.log('[action.gemini_image] Login detected! Saving session...');
162
+ }
163
+ // Save/refresh cookies after confirming login
164
+ const liveCookies = await browser.getCookies(client, sessionId).catch(() => []);
165
+ const userAgent = await browser.evaluateJs(client, sessionId, 'navigator.userAgent').catch(() => 'unknown');
166
+ const username = await browser.evaluateJs(client, sessionId, "document.querySelector('.gb_A.gb_Sa')?.textContent?.trim() ?? 'gemini-user'").catch(() => 'gemini-user');
167
+ await saveStoredSession('gemini', liveCookies, String(userAgent), String(username));
168
+ // Ensure we're on the app page with the input visible
169
+ if (!inputRef) {
170
+ await browser.openUrl(client, sessionId, 'https://gemini.google.com/app');
171
+ inputRef = await browser.findBySelector(client, sessionId, refs, '.ql-editor').catch(() => null);
172
+ }
173
+ if (!inputRef)
174
+ return null;
175
+ // Fill and submit the prompt
176
+ await browser.fillElement(client, sessionId, inputRef, prompt);
177
+ await new Promise(r => setTimeout(r, 300));
178
+ await browser.pressKey(client, sessionId, 'Return');
179
+ console.log('[action.gemini_image] Prompt submitted to Gemini, waiting for image...');
180
+ // Poll up to 90s for generated image
181
+ const deadline = Date.now() + 90_000;
182
+ while (Date.now() < deadline) {
183
+ const found = await browser.evaluateJs(client, sessionId, GEMINI_IMAGE_CHECK).catch(() => false);
184
+ if (found)
185
+ break;
186
+ await new Promise(r => setTimeout(r, 500));
187
+ }
188
+ await mkdir(dirname(outputPath), { recursive: true });
189
+ // Extract image URL and download
190
+ const imgSrc = (await browser.evaluateJs(client, sessionId, GEMINI_IMAGE_SRC).catch(() => ''));
191
+ if (imgSrc && (imgSrc.startsWith('https://') || imgSrc.startsWith('http://'))) {
192
+ try {
193
+ const resp = await fetch(imgSrc);
194
+ if (resp.ok) {
195
+ await writeFile(outputPath, Buffer.from(await resp.arrayBuffer()));
196
+ console.log(`[action.gemini_image] Image saved → ${outputPath}`);
197
+ return outputPath;
198
+ }
199
+ }
200
+ catch { /* fall through to screenshot */ }
201
+ }
202
+ // Fallback: screenshot the response
203
+ const screenshotPath = outputPath.replace(/\.(png|jpe?g|webp)$/i, '') + '-screenshot.png';
204
+ const ss = await browser.captureScreenshot(client, sessionId, { path: screenshotPath, fullPage: true }).catch(() => null);
205
+ if (ss) {
206
+ console.log(`[action.gemini_image] Screenshot saved → ${ss.path}`);
207
+ return ss.path;
208
+ }
209
+ return null;
210
+ }
211
+ finally {
212
+ client.close();
213
+ }
214
+ }
215
+ export function createBuiltinHandlers() {
216
+ const handlers = new Map();
217
+ // action.http
218
+ // config: { url, method?, headers?, body?, responseField? }
219
+ // Puts { statusCode, body, json? } into item.data[responseField ?? 'response']
220
+ handlers.set('action.http', async (items, config) => {
221
+ const url = String(config['url'] ?? '');
222
+ const method = String(config['method'] ?? 'GET').toUpperCase();
223
+ const headers = config['headers'] ?? {};
224
+ const body = config['body'] !== undefined ? JSON.stringify(config['body']) : undefined;
225
+ const responseField = String(config['responseField'] ?? 'response');
226
+ const res = await fetch(url, {
227
+ method,
228
+ headers: { 'Content-Type': 'application/json', ...headers },
229
+ body: method !== 'GET' && method !== 'HEAD' ? body : undefined,
230
+ });
231
+ const text = await res.text();
232
+ let json;
233
+ try {
234
+ json = JSON.parse(text);
235
+ }
236
+ catch { /* not JSON */ }
237
+ return items.map(item => ({
238
+ ...item,
239
+ data: {
240
+ ...item.data,
241
+ [responseField]: { statusCode: res.status, body: text, json },
242
+ },
243
+ }));
244
+ });
245
+ // action.save_file
246
+ // config: { path, content?, field?, encoding? }
247
+ // Writes item.data[field] (or binaryBase64 decoded) to disk
248
+ handlers.set('action.save_file', async (items, config) => {
249
+ const results = [];
250
+ for (const item of items) {
251
+ const outPath = safeResolvePath(String(config['path'] ?? './output.txt'));
252
+ const field = config['field'];
253
+ const encoding = String(config['encoding'] ?? 'utf8');
254
+ await mkdir(dirname(outPath), { recursive: true });
255
+ if (item.binaryBase64) {
256
+ await writeFile(outPath, Buffer.from(item.binaryBase64, 'base64'));
257
+ }
258
+ else {
259
+ const content = field
260
+ ? JSON.stringify(item.data[field] ?? '', null, 2)
261
+ : (config['content'] ?? JSON.stringify(item.data, null, 2));
262
+ await writeFile(outPath, content, encoding);
263
+ }
264
+ results.push({ ...item, data: { ...item.data, savedPath: outPath } });
265
+ }
266
+ return results;
267
+ });
268
+ // action.log
269
+ // config: { label? }
270
+ handlers.set('action.log', async (items, config) => {
271
+ const label = String(config['label'] ?? 'action.log');
272
+ for (const item of items) {
273
+ console.log(`[${label}]`, JSON.stringify(item.data, null, 2));
274
+ }
275
+ return items;
276
+ });
277
+ // action.gemini_image
278
+ // config: { prompt, cdpPort?, outputPath?, apiKey?, model?, aspectRatio? }
279
+ // Priority: (1) Gemini web browser via CDP port 9222, (2) Imagen REST API, (3) mock
280
+ handlers.set('action.gemini_image', async (items, config) => {
281
+ const cdpPort = Number(config['cdpPort'] ?? process.env['GEMINI_CDP_PORT'] ?? 9222);
282
+ const apiKey = String(config['apiKey'] ?? process.env['GEMINI_API_KEY'] ?? process.env['GOOGLE_API_KEY'] ?? '');
283
+ const model = String(config['model'] ?? 'imagen-3.0-generate-001');
284
+ const aspectRatio = String(config['aspectRatio'] ?? '1:1');
285
+ const outputPath = config['outputPath'];
286
+ const results = [];
287
+ for (const item of items) {
288
+ const prompt = String(config['prompt'] ?? item.data['prompt'] ?? '');
289
+ const filePath = safeResolvePath(outputPath ?? `./output/gemini-image-${Date.now()}.png`);
290
+ // Priority 1: Browser automation via authenticated Chrome session
291
+ const browserPath = await generateViaGeminiBrowser(prompt, filePath, cdpPort);
292
+ if (browserPath) {
293
+ results.push({
294
+ ...item,
295
+ data: { ...item.data, prompt, generatedImagePath: browserPath, source: 'gemini-browser' },
296
+ });
297
+ continue;
298
+ }
299
+ // Priority 2: Gemini Imagen REST API
300
+ if (apiKey) {
301
+ console.log(`[action.gemini_image] Browser unavailable — trying Imagen REST API`);
302
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:predict?key=${apiKey}`;
303
+ const res = await fetch(url, {
304
+ method: 'POST',
305
+ headers: { 'Content-Type': 'application/json' },
306
+ body: JSON.stringify({
307
+ instances: [{ prompt }],
308
+ parameters: { sampleCount: 1, aspectRatio },
309
+ }),
310
+ });
311
+ if (!res.ok)
312
+ throw new Error(`Gemini Imagen API error ${res.status}: ${await res.text()}`);
313
+ const data = await res.json();
314
+ const prediction = data.predictions?.[0];
315
+ if (!prediction?.bytesBase64Encoded)
316
+ throw new Error('No image data in Gemini response');
317
+ await mkdir(dirname(filePath), { recursive: true });
318
+ await writeFile(filePath, Buffer.from(prediction.bytesBase64Encoded, 'base64'));
319
+ results.push({
320
+ ...item,
321
+ data: { ...item.data, prompt, generatedImagePath: filePath, mimeType: prediction.mimeType ?? 'image/png', source: 'gemini-api' },
322
+ binaryBase64: prediction.bytesBase64Encoded,
323
+ });
324
+ continue;
325
+ }
326
+ // Priority 3: Mock mode — no browser on port 9222 and no API key
327
+ console.log(`[action.gemini_image] No browser on port ${cdpPort} and no API key — mock mode.`);
328
+ console.log(` Prompt: "${prompt}"`);
329
+ results.push({
330
+ ...item,
331
+ data: {
332
+ ...item.data,
333
+ prompt,
334
+ mockMode: true,
335
+ note: `Set GEMINI_CDP_PORT env var (default: 9222) for browser mode, or GEMINI_API_KEY for REST API`,
336
+ },
337
+ });
338
+ }
339
+ return results;
340
+ });
341
+ return handlers;
342
+ }
343
+ //# sourceMappingURL=builtin-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-handlers.js","sourceRoot":"","sources":["../../../../src/browser/workflow/builtin-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { WorkflowDef, Item, RunRecord, StepEvent } from './types.js';
2
+ export type NodeHandler = (items: Item[], config: Record<string, unknown>) => Promise<Item[]>;
3
+ export interface EngineOptions {
4
+ handlers?: Map<string, NodeHandler>;
5
+ onEvent?: (event: StepEvent) => void;
6
+ signal?: AbortSignal;
7
+ params?: Record<string, string>;
8
+ }
9
+ export declare function runWorkflow(def: WorkflowDef, options?: EngineOptions): Promise<RunRecord>;
10
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/browser/workflow/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAW,IAAI,EAAE,SAAS,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAE9F,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,SAAS,CAAC,CA2HpB"}
@@ -0,0 +1,174 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { resolveExpression, resolveConfig } from './expression.js';
3
+ import { getDashboard } from '../dashboard/server.js';
4
+ export async function runWorkflow(def, options = {}) {
5
+ const { handlers = new Map(), onEvent = () => { }, signal, params = {} } = options;
6
+ const runId = randomUUID();
7
+ const startedAt = Date.now();
8
+ // Build a unified abort controller that merges the caller's signal with dashboard stop-requests.
9
+ const controller = new AbortController();
10
+ if (signal) {
11
+ if (signal.aborted) {
12
+ controller.abort();
13
+ }
14
+ else {
15
+ signal.addEventListener('abort', () => controller.abort(), { once: true });
16
+ }
17
+ }
18
+ const dashboard = getDashboard();
19
+ let stopPollTimer;
20
+ if (dashboard) {
21
+ stopPollTimer = setInterval(() => {
22
+ if (dashboard.isStopRequested(runId))
23
+ controller.abort();
24
+ }, 500);
25
+ // Avoid keeping Node.js event loop alive if nothing else is running
26
+ stopPollTimer.unref?.();
27
+ }
28
+ const emit = (partial) => onEvent({ runId, workflowId: def.id, workflowName: def.name, timestamp: Date.now(), ...partial });
29
+ emit({ nodeId: '', nodeName: '', eventType: 'run_started' });
30
+ // Build adjacency structures
31
+ const nodeMap = new Map(def.nodes.map(n => [n.id, n]));
32
+ const inDegree = new Map(def.nodes.map(n => [n.id, 0]));
33
+ const outEdges = new Map();
34
+ const toEdges = new Map();
35
+ for (const conn of def.connections) {
36
+ inDegree.set(conn.to, (inDegree.get(conn.to) ?? 0) + 1);
37
+ const edges = outEdges.get(conn.from) ?? [];
38
+ edges.push({ to: conn.to, handle: conn.handle });
39
+ outEdges.set(conn.from, edges);
40
+ const toList = toEdges.get(conn.to) ?? [];
41
+ toList.push({ from: conn.from, handle: conn.handle });
42
+ toEdges.set(conn.to, toList);
43
+ }
44
+ // Kahn's topological sort
45
+ const queue = [];
46
+ const sorted = [];
47
+ for (const [id, deg] of inDegree) {
48
+ if (deg === 0)
49
+ queue.push(id);
50
+ }
51
+ while (queue.length > 0) {
52
+ const id = queue.shift();
53
+ sorted.push(id);
54
+ for (const edge of outEdges.get(id) ?? []) {
55
+ const newDeg = (inDegree.get(edge.to) ?? 0) - 1;
56
+ inDegree.set(edge.to, newDeg);
57
+ if (newDeg === 0)
58
+ queue.push(edge.to);
59
+ }
60
+ }
61
+ if (sorted.length !== def.nodes.length) {
62
+ throw new Error('Workflow contains a cycle');
63
+ }
64
+ // Node output accumulator
65
+ const nodeOutputs = new Map();
66
+ let itemsProcessed = 0;
67
+ let runStatus = 'completed';
68
+ let runError;
69
+ try {
70
+ for (const nodeId of sorted) {
71
+ if (controller.signal.aborted) {
72
+ runStatus = 'stopped';
73
+ emit({ nodeId, nodeName: nodeId, eventType: 'run_stopped' });
74
+ break;
75
+ }
76
+ const node = nodeMap.get(nodeId);
77
+ const nodeName = node.name ?? node.id;
78
+ const t0 = Date.now();
79
+ // Collect inputs from predecessor outputs
80
+ const inputItems = collectInputs(nodeId, nodeOutputs, toEdges);
81
+ emit({ nodeId, nodeName, eventType: 'step_started', itemTotal: inputItems.length });
82
+ try {
83
+ const outputs = await executeNode(node, inputItems, handlers, nodeOutputs, params, def.allowEnvAccess);
84
+ nodeOutputs.set(nodeId, outputs);
85
+ itemsProcessed += outputs.length;
86
+ emit({ nodeId, nodeName, eventType: 'step_completed', durationMs: Date.now() - t0, itemTotal: outputs.length });
87
+ }
88
+ catch (err) {
89
+ const error = err instanceof Error ? err.message : String(err);
90
+ emit({ nodeId, nodeName, eventType: 'step_failed', error, durationMs: Date.now() - t0 });
91
+ if (node.onError === 'skip') {
92
+ nodeOutputs.set(nodeId, []);
93
+ }
94
+ else {
95
+ runStatus = 'failed';
96
+ runError = error;
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ }
102
+ finally {
103
+ if (stopPollTimer !== undefined)
104
+ clearInterval(stopPollTimer);
105
+ }
106
+ const completedAt = Date.now();
107
+ const record = {
108
+ id: runId,
109
+ workflowId: def.id,
110
+ workflowName: def.name,
111
+ status: runStatus,
112
+ startedAt,
113
+ completedAt,
114
+ itemsProcessed,
115
+ itemsTotal: itemsProcessed,
116
+ error: runError,
117
+ };
118
+ emit({ nodeId: '', nodeName: '', eventType: runStatus === 'completed' ? 'run_completed' : 'run_stopped', error: runError });
119
+ return record;
120
+ }
121
+ function collectInputs(nodeId, nodeOutputs, toEdges) {
122
+ const predecessors = toEdges.get(nodeId) ?? [];
123
+ if (predecessors.length === 0)
124
+ return [{ data: {} }];
125
+ return predecessors.flatMap(({ from, handle }) => {
126
+ const items = nodeOutputs.get(from) ?? [];
127
+ if (handle === 'true')
128
+ return items.filter(item => item.data['__ifResult'] === true);
129
+ if (handle === 'false')
130
+ return items.filter(item => item.data['__ifResult'] === false);
131
+ return items;
132
+ });
133
+ }
134
+ async function executeNode(node, inputs, handlers, nodeOutputs, params, allowEnvAccess) {
135
+ const allOutputs = Object.fromEntries(nodeOutputs);
136
+ const { type, config } = node;
137
+ if (type === 'trigger.manual') {
138
+ const items = config['items'];
139
+ if (Array.isArray(items))
140
+ return items;
141
+ return inputs;
142
+ }
143
+ if (type === 'core.set') {
144
+ return inputs.map(item => {
145
+ const resolved = resolveConfig(config, item, allOutputs, params, allowEnvAccess);
146
+ return { ...item, data: { ...item.data, ...resolved } };
147
+ });
148
+ }
149
+ if (type === 'core.filter') {
150
+ const predicate = config['expression'];
151
+ return inputs.filter(item => {
152
+ try {
153
+ return Boolean(resolveExpression(predicate, item, allOutputs, params, allowEnvAccess));
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ });
159
+ }
160
+ if (type === 'core.if') {
161
+ const predicate = config['expression'];
162
+ return inputs.map(item => {
163
+ const result = Boolean(resolveExpression(predicate, item, allOutputs, params, allowEnvAccess));
164
+ return { ...item, data: { ...item.data, __ifResult: result } };
165
+ });
166
+ }
167
+ // action.* — delegate to registered handler
168
+ const handler = handlers.get(type);
169
+ if (!handler)
170
+ throw new Error(`No handler registered for node type: ${type}`);
171
+ const resolvedConfig = resolveConfig(config, inputs[0] ?? { data: {} }, allOutputs, params, allowEnvAccess);
172
+ return handler(inputs, resolvedConfig);
173
+ }
174
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/browser/workflow/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAYtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAgB,EAChB,UAAyB,EAAE;IAE3B,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAClF,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,iGAAiG;IACjG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,aAAyD,CAAC;IAC9D,IAAI,SAAS,EAAE,CAAC;QACd,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,IAAI,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC;gBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3D,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,oEAAoE;QACpE,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAA+E,EAAE,EAAE,CAC/F,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAEpG,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IAE7D,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAiB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6C,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+C,CAAC;IAEvE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,0BAA0B;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,0BAA0B;IAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAc,WAAW,CAAC;IACvC,IAAI,QAA4B,CAAC;IAEjC,IAAI,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,SAAS,GAAG,SAAS,CAAC;gBACtB,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC7D,MAAM;YACR,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEtB,0CAA0C;YAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAE/D,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAEpF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;gBACvG,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;gBACjC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAClH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzF,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;oBAC5B,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,QAAQ,CAAC;oBACrB,QAAQ,GAAG,KAAK,CAAC;oBACjB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,KAAK,SAAS;YAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAc;QACxB,EAAE,EAAE,KAAK;QACT,UAAU,EAAE,GAAG,CAAC,EAAE;QAClB,YAAY,EAAE,GAAG,CAAC,IAAI;QACtB,MAAM,EAAE,SAAS;QACjB,SAAS;QACT,WAAW;QACX,cAAc;QACd,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC;IAEF,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5H,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,WAAgC,EAAE,OAAyD;IAChI,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC;QACrF,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAa,EACb,MAAc,EACd,QAAkC,EAClC,WAAgC,EAChC,MAA8B,EAC9B,cAAwB;IAExB,MAAM,UAAU,GAA2B,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE9B,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAe,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YACjF,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAW,CAAC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC1B,IAAI,CAAC;gBACH,OAAO,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YACzF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAW,CAAC;QACjD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAC/F,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5G,OAAO,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Item } from './types.js';
2
+ export declare function resolveExpression(template: string, item: Item, nodeOutputs: Record<string, Item[]>, params: Record<string, string>, allowEnvAccess?: boolean): string;
3
+ export declare function resolveConfig(config: Record<string, unknown>, item: Item, nodeOutputs: Record<string, Item[]>, params: Record<string, string>, allowEnvAccess?: boolean): Record<string, unknown>;
4
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../../../src/browser/workflow/expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAqBvC,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,cAAc,CAAC,EAAE,OAAO,GACvB,MAAM,CAWR;AAwDD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,cAAc,CAAC,EAAE,OAAO,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB"}