visionclaw 0.1.216-beta.1 → 0.1.216-beta.3

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 (195) hide show
  1. package/dist/agent/browser-launcher.d.ts +14 -8
  2. package/dist/agent/browser-launcher.d.ts.map +1 -1
  3. package/dist/agent/browser-launcher.js +155 -126
  4. package/dist/agent/browser-launcher.js.map +1 -1
  5. package/dist/agent/browser-selection.d.ts +24 -0
  6. package/dist/agent/browser-selection.d.ts.map +1 -0
  7. package/dist/agent/browser-selection.js +90 -0
  8. package/dist/agent/browser-selection.js.map +1 -0
  9. package/dist/agent/context.d.ts.map +1 -1
  10. package/dist/agent/context.js +21 -2
  11. package/dist/agent/context.js.map +1 -1
  12. package/dist/agent/engine-fallback.d.ts +175 -0
  13. package/dist/agent/engine-fallback.d.ts.map +1 -0
  14. package/dist/agent/engine-fallback.js +454 -0
  15. package/dist/agent/engine-fallback.js.map +1 -0
  16. package/dist/agent/engine-probe.d.ts +47 -0
  17. package/dist/agent/engine-probe.d.ts.map +1 -0
  18. package/dist/agent/engine-probe.js +99 -0
  19. package/dist/agent/engine-probe.js.map +1 -0
  20. package/dist/agent/engine-switch-target.d.ts.map +1 -1
  21. package/dist/agent/engine-switch-target.js +23 -5
  22. package/dist/agent/engine-switch-target.js.map +1 -1
  23. package/dist/agent/engine-switch.d.ts +21 -4
  24. package/dist/agent/engine-switch.d.ts.map +1 -1
  25. package/dist/agent/engine-switch.js +71 -22
  26. package/dist/agent/engine-switch.js.map +1 -1
  27. package/dist/agent/engines/browser-tool-policy.d.ts +3 -8
  28. package/dist/agent/engines/browser-tool-policy.d.ts.map +1 -1
  29. package/dist/agent/engines/browser-tool-policy.js +1 -49
  30. package/dist/agent/engines/browser-tool-policy.js.map +1 -1
  31. package/dist/agent/engines/claude/session.d.ts +0 -1
  32. package/dist/agent/engines/claude/session.d.ts.map +1 -1
  33. package/dist/agent/engines/claude/session.js +2 -8
  34. package/dist/agent/engines/claude/session.js.map +1 -1
  35. package/dist/agent/engines/pi/tools.d.ts.map +1 -1
  36. package/dist/agent/engines/pi/tools.js +4 -3
  37. package/dist/agent/engines/pi/tools.js.map +1 -1
  38. package/dist/agent/engines/pi-coding/session.d.ts +0 -1
  39. package/dist/agent/engines/pi-coding/session.d.ts.map +1 -1
  40. package/dist/agent/engines/pi-coding/session.js +2 -8
  41. package/dist/agent/engines/pi-coding/session.js.map +1 -1
  42. package/dist/agent/engines/session-types.d.ts +2 -0
  43. package/dist/agent/engines/session-types.d.ts.map +1 -1
  44. package/dist/agent/heartbeat-manager.d.ts +10 -6
  45. package/dist/agent/heartbeat-manager.d.ts.map +1 -1
  46. package/dist/agent/heartbeat-manager.js +30 -24
  47. package/dist/agent/heartbeat-manager.js.map +1 -1
  48. package/dist/agent/interrupt-handler.d.ts.map +1 -1
  49. package/dist/agent/interrupt-handler.js +2 -1
  50. package/dist/agent/interrupt-handler.js.map +1 -1
  51. package/dist/agent/loop.d.ts.map +1 -1
  52. package/dist/agent/loop.js +80 -15
  53. package/dist/agent/loop.js.map +1 -1
  54. package/dist/agent/model-provider.d.ts +63 -12
  55. package/dist/agent/model-provider.d.ts.map +1 -1
  56. package/dist/agent/model-provider.js +97 -34
  57. package/dist/agent/model-provider.js.map +1 -1
  58. package/dist/agent/nightly-maintenance/memory-dreaming.d.ts +2 -2
  59. package/dist/agent/nightly-maintenance/memory-dreaming.js +4 -4
  60. package/dist/agent/nightly-maintenance/memory-dreaming.js.map +1 -1
  61. package/dist/agent/nightly-maintenance/vocabulary-processor.d.ts +2 -11
  62. package/dist/agent/nightly-maintenance/vocabulary-processor.d.ts.map +1 -1
  63. package/dist/agent/nightly-maintenance/vocabulary-processor.js +36 -70
  64. package/dist/agent/nightly-maintenance/vocabulary-processor.js.map +1 -1
  65. package/dist/agent/onboarding-gate.d.ts.map +1 -1
  66. package/dist/agent/onboarding-gate.js +2 -0
  67. package/dist/agent/onboarding-gate.js.map +1 -1
  68. package/dist/agent/runtime-surface.d.ts +7 -23
  69. package/dist/agent/runtime-surface.d.ts.map +1 -1
  70. package/dist/agent/runtime-surface.js +19 -144
  71. package/dist/agent/runtime-surface.js.map +1 -1
  72. package/dist/agent/screenshot-injector.js +1 -1
  73. package/dist/agent/screenshot-injector.js.map +1 -1
  74. package/dist/agent/status.d.ts.map +1 -1
  75. package/dist/agent/status.js +27 -22
  76. package/dist/agent/status.js.map +1 -1
  77. package/dist/agent/stream-handler.d.ts.map +1 -1
  78. package/dist/agent/stream-handler.js +0 -1
  79. package/dist/agent/stream-handler.js.map +1 -1
  80. package/dist/agent/tool-call-watchdog.d.ts.map +1 -1
  81. package/dist/agent/tool-call-watchdog.js +3 -4
  82. package/dist/agent/tool-call-watchdog.js.map +1 -1
  83. package/dist/agent/tool-usage.js +1 -1
  84. package/dist/agent/tool-usage.js.map +1 -1
  85. package/dist/agent/transcript-summarizer.d.ts +2 -0
  86. package/dist/agent/transcript-summarizer.d.ts.map +1 -1
  87. package/dist/agent/transcript-summarizer.js +60 -7
  88. package/dist/agent/transcript-summarizer.js.map +1 -1
  89. package/dist/agent/vocabulary-evidence.d.ts +11 -0
  90. package/dist/agent/vocabulary-evidence.d.ts.map +1 -0
  91. package/dist/agent/vocabulary-evidence.js +17 -0
  92. package/dist/agent/vocabulary-evidence.js.map +1 -0
  93. package/dist/agent/vocabulary-glossary.d.ts +15 -6
  94. package/dist/agent/vocabulary-glossary.d.ts.map +1 -1
  95. package/dist/agent/vocabulary-glossary.js +69 -22
  96. package/dist/agent/vocabulary-glossary.js.map +1 -1
  97. package/dist/agent/vocabulary-injection.d.ts +8 -5
  98. package/dist/agent/vocabulary-injection.d.ts.map +1 -1
  99. package/dist/agent/vocabulary-injection.js +10 -12
  100. package/dist/agent/vocabulary-injection.js.map +1 -1
  101. package/dist/agent/wake-cycle-runner.d.ts +61 -3
  102. package/dist/agent/wake-cycle-runner.d.ts.map +1 -1
  103. package/dist/agent/wake-cycle-runner.js +304 -64
  104. package/dist/agent/wake-cycle-runner.js.map +1 -1
  105. package/dist/channels/finapp.d.ts.map +1 -1
  106. package/dist/channels/finapp.js +3 -1
  107. package/dist/channels/finapp.js.map +1 -1
  108. package/dist/channels/telegram.d.ts.map +1 -1
  109. package/dist/channels/telegram.js +3 -1
  110. package/dist/channels/telegram.js.map +1 -1
  111. package/dist/config/index.d.ts +6 -1
  112. package/dist/config/index.d.ts.map +1 -1
  113. package/dist/config/index.js +9 -2
  114. package/dist/config/index.js.map +1 -1
  115. package/dist/config/types.d.ts +18 -6
  116. package/dist/config/types.d.ts.map +1 -1
  117. package/dist/config/types.js +14 -2
  118. package/dist/config/types.js.map +1 -1
  119. package/dist/e2e/suites/browser-detection.d.ts.map +1 -1
  120. package/dist/e2e/suites/browser-detection.js +4 -16
  121. package/dist/e2e/suites/browser-detection.js.map +1 -1
  122. package/dist/index.js.map +1 -1
  123. package/dist/onboarding/onboarding-service-client.d.ts +15 -6
  124. package/dist/onboarding/onboarding-service-client.d.ts.map +1 -1
  125. package/dist/onboarding/onboarding-service-client.js.map +1 -1
  126. package/dist/onboarding/prepare-linux.d.ts.map +1 -1
  127. package/dist/onboarding/prepare-linux.js +23 -3
  128. package/dist/onboarding/prepare-linux.js.map +1 -1
  129. package/dist/onboarding/prepare-mac.d.ts +0 -5
  130. package/dist/onboarding/prepare-mac.d.ts.map +1 -1
  131. package/dist/onboarding/prepare-mac.js +1 -95
  132. package/dist/onboarding/prepare-mac.js.map +1 -1
  133. package/dist/reconfigure.d.ts.map +1 -1
  134. package/dist/reconfigure.js +0 -22
  135. package/dist/reconfigure.js.map +1 -1
  136. package/dist/reset.d.ts.map +1 -1
  137. package/dist/reset.js +0 -5
  138. package/dist/reset.js.map +1 -1
  139. package/dist/service/retired-services.d.ts.map +1 -1
  140. package/dist/service/retired-services.js +4 -1
  141. package/dist/service/retired-services.js.map +1 -1
  142. package/dist/stt-client.d.ts.map +1 -1
  143. package/dist/stt-client.js +20 -14
  144. package/dist/stt-client.js.map +1 -1
  145. package/dist/system/chrome-profiles.d.ts +1 -1
  146. package/dist/system/chrome-profiles.d.ts.map +1 -1
  147. package/dist/system/chrome-profiles.js +1 -1
  148. package/dist/system/chrome-profiles.js.map +1 -1
  149. package/dist/threads/init-thread-dir.js +2 -2
  150. package/dist/threads/init-thread-dir.js.map +1 -1
  151. package/dist/tools/browser-set-engine.d.ts +19 -0
  152. package/dist/tools/browser-set-engine.d.ts.map +1 -0
  153. package/dist/tools/browser-set-engine.js +76 -0
  154. package/dist/tools/browser-set-engine.js.map +1 -0
  155. package/dist/tools/index.d.ts.map +1 -1
  156. package/dist/tools/index.js +4 -2
  157. package/dist/tools/index.js.map +1 -1
  158. package/dist/tools/mcp-manager.d.ts.map +1 -1
  159. package/dist/tools/mcp-manager.js +0 -1
  160. package/dist/tools/mcp-manager.js.map +1 -1
  161. package/dist/tools/transcribe-audio.d.ts +4 -9
  162. package/dist/tools/transcribe-audio.d.ts.map +1 -1
  163. package/dist/tools/transcribe-audio.js +22 -33
  164. package/dist/tools/transcribe-audio.js.map +1 -1
  165. package/dist/transcription-context.d.ts +9 -0
  166. package/dist/transcription-context.d.ts.map +1 -0
  167. package/dist/transcription-context.js +12 -0
  168. package/dist/transcription-context.js.map +1 -0
  169. package/dist/utils/transcribe.d.ts +3 -2
  170. package/dist/utils/transcribe.d.ts.map +1 -1
  171. package/dist/utils/transcribe.js +5 -4
  172. package/dist/utils/transcribe.js.map +1 -1
  173. package/dist-agent/bundle.cjs +2 -2
  174. package/package.json +1 -2
  175. package/dist/agent/engines/claude/session-browser-policy.d.ts +0 -49
  176. package/dist/agent/engines/claude/session-browser-policy.d.ts.map +0 -1
  177. package/dist/agent/engines/claude/session-browser-policy.js +0 -223
  178. package/dist/agent/engines/claude/session-browser-policy.js.map +0 -1
  179. package/dist/agent/provider-fallback.d.ts +0 -69
  180. package/dist/agent/provider-fallback.d.ts.map +0 -1
  181. package/dist/agent/provider-fallback.js +0 -169
  182. package/dist/agent/provider-fallback.js.map +0 -1
  183. package/dist/entry/playwriter-relay.d.ts +0 -2
  184. package/dist/entry/playwriter-relay.d.ts.map +0 -1
  185. package/dist/entry/playwriter-relay.js +0 -98
  186. package/dist/entry/playwriter-relay.js.map +0 -1
  187. package/dist/onboarding/playwriter-extension.d.ts +0 -69
  188. package/dist/onboarding/playwriter-extension.d.ts.map +0 -1
  189. package/dist/onboarding/playwriter-extension.js +0 -284
  190. package/dist/onboarding/playwriter-extension.js.map +0 -1
  191. package/dist/utils/playwriter-relay.d.ts +0 -235
  192. package/dist/utils/playwriter-relay.d.ts.map +0 -1
  193. package/dist/utils/playwriter-relay.js +0 -1180
  194. package/dist/utils/playwriter-relay.js.map +0 -1
  195. package/dist-agent/playwriter-relay.cjs +0 -95
@@ -1,13 +1,19 @@
1
+ import { type BrowserSelection } from "./browser-selection.js";
2
+ import type { VisionClawConfig } from "../config/types.js";
3
+ export declare function getActiveBrowserSelection(config?: VisionClawConfig): BrowserSelection;
4
+ export declare function getCdpEndpoint(config?: VisionClawConfig): string;
5
+ /** Values 011-gpu-info.patch and the UA-CH patch both understand. */
6
+ export declare function fingerprintPlatform(platform?: NodeJS.Platform): string;
1
7
  /**
2
- * Ensure a CDP-enabled Chrome is running with healthy page targets.
3
- * If page targets look unhealthy (crashed tabs, etc.) the browser is
4
- * killed and relaunched so Playwright's `connectOverCDP` doesn't hang.
8
+ * 1..2^31-1. The UA-CH patch parses the seed with StringToInt, which saturates
9
+ * at INT_MAX, so anything above 2^31-1 collapses to one version.
5
10
  */
6
- export declare function ensureBrowser(): Promise<void>;
11
+ export declare const FINGERPRINT_SEED_MAX = 2147483647;
7
12
  /**
8
- * Kill the current Chrome and launch a fresh instance. Called as a
9
- * recovery step when a Playwright MCP tool call times out.
13
+ * One seed per profile, kept across restarts. A new machine gets a new file.
14
+ * Do not randomize per launch: the same host must keep the same fingerprint.
10
15
  */
11
- export declare function restartBrowser(): Promise<void>;
12
- export declare function getCdpEndpoint(): string;
16
+ export declare function fingerprintSeed(seedPath?: string): number;
17
+ export declare function ensureBrowser(config?: VisionClawConfig): Promise<void>;
18
+ export declare function restartBrowser(config?: VisionClawConfig): Promise<void>;
13
19
  //# sourceMappingURL=browser-launcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/agent/browser-launcher.ts"],"names":[],"mappings":"AA6OA;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBnD;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
1
+ {"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/agent/browser-launcher.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAiC3D,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAErF;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAEhE;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAExF;AAkFD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,aAAc,CAAC;AAMhD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAiC,GAAG,MAAM,CAWnF;AAqGD,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC5E;AAED,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E"}
@@ -1,17 +1,18 @@
1
1
  import { execSync, spawn } from "node:child_process";
2
+ import { randomInt } from "node:crypto";
2
3
  import fs from "node:fs";
3
- import { getPlaywrightProfileDir } from "../config/index.js";
4
+ import path from "node:path";
5
+ import { getFingerprintProfileDir, getFingerprintSeedPath, getPlaywrightProfileDir } from "../config/index.js";
4
6
  import { logger } from "../logger.js";
5
- import { getHostCapabilities, resolveChromePath } from "../system/host-capabilities.js";
6
- const CDP_PORT = 9222;
7
+ import { getHostCapabilities } from "../system/host-capabilities.js";
8
+ import { describeBrowserSelection, resolveBrowserSelection, } from "./browser-selection.js";
9
+ const STOCK_CDP_PORT = 9222;
10
+ const FINGERPRINT_CDP_PORT = 9333;
7
11
  const CDP_STARTUP_TIMEOUT_MS = 8_000;
8
12
  const CDP_POLL_INTERVAL_MS = 300;
9
13
  const NEW_BROWSER_SETTLE_MS = 1_000;
10
- const CDP_BASE = `http://127.0.0.1:${CDP_PORT}`;
11
- /**
12
- * Detect whether we're running inside a virtual machine (e.g. Lume VM).
13
- * On macOS, VMs report a model like "VirtualMac2,1" via sysctl.
14
- */
14
+ const KILL_WAIT_MS = 5_000;
15
+ let activeSelection;
15
16
  function isVirtualMachine() {
16
17
  if (process.platform !== "darwin")
17
18
  return false;
@@ -23,26 +24,37 @@ function isVirtualMachine() {
23
24
  return false;
24
25
  }
25
26
  }
26
- const CHROME_PATH = resolveChromePath();
27
- /**
28
- * Check whether a CDP-enabled browser is responding on the configured port.
29
- */
30
- async function isCdpAlive() {
27
+ function cdpPortFor(engine) {
28
+ return engine === "fingerprint" ? FINGERPRINT_CDP_PORT : STOCK_CDP_PORT;
29
+ }
30
+ function cdpBase(engine) {
31
+ return `http://127.0.0.1:${cdpPortFor(engine)}`;
32
+ }
33
+ function profileDirFor(engine) {
34
+ return engine === "fingerprint" ? getFingerprintProfileDir() : getPlaywrightProfileDir();
35
+ }
36
+ export function getActiveBrowserSelection(config) {
37
+ return activeSelection ?? resolveBrowserSelection(config);
38
+ }
39
+ export function getCdpEndpoint(config) {
40
+ return cdpBase(getActiveBrowserSelection(config).engine);
41
+ }
42
+ /** Values 011-gpu-info.patch and the UA-CH patch both understand. */
43
+ export function fingerprintPlatform(platform = process.platform) {
44
+ return platform === "darwin" ? "macos" : "linux";
45
+ }
46
+ async function isCdpAlive(engine) {
31
47
  try {
32
- const resp = await fetch(`${CDP_BASE}/json/version`);
48
+ const resp = await fetch(`${cdpBase(engine)}/json/version`);
33
49
  return resp.ok;
34
50
  }
35
51
  catch {
36
52
  return false;
37
53
  }
38
54
  }
39
- /**
40
- * Probe `/json/list` to get the current set of CDP targets.
41
- * Returns null if CDP is unreachable.
42
- */
43
- async function listCdpTargets() {
55
+ async function listCdpTargets(engine) {
44
56
  try {
45
- const resp = await fetch(`${CDP_BASE}/json/list`, { signal: AbortSignal.timeout(3_000) });
57
+ const resp = await fetch(`${cdpBase(engine)}/json/list`, { signal: AbortSignal.timeout(3_000) });
46
58
  if (!resp.ok)
47
59
  return null;
48
60
  return (await resp.json());
@@ -51,15 +63,8 @@ async function listCdpTargets() {
51
63
  return null;
52
64
  }
53
65
  }
54
- /**
55
- * Heuristic: check whether Chrome's page targets look healthy enough for
56
- * Playwright's `connectOverCDP` to succeed. Playwright hangs in
57
- * `_waitForAllPagesToBeInitialized()` when a page target exists but its
58
- * webSocketDebuggerUrl is missing (already attached) or the page URL
59
- * indicates a crash.
60
- */
61
- async function arePagesHealthy() {
62
- const targets = await listCdpTargets();
66
+ async function arePagesHealthy(engine) {
67
+ const targets = await listCdpTargets(engine);
63
68
  if (!targets)
64
69
  return false;
65
70
  const pages = targets.filter((t) => t.type === "page");
@@ -73,42 +78,28 @@ async function arePagesHealthy() {
73
78
  }
74
79
  return true;
75
80
  }
76
- /**
77
- * Check whether a Chrome process launched with our CDP debug port already
78
- * exists, regardless of whether it is responding on the port yet.
79
- *
80
- * {@link isCdpAlive} only sees a *ready* CDP server; a Chrome that was just
81
- * spawned but hasn't bound the port yet looks dead to it, which would let
82
- * {@link launchBrowser} spawn a second instance that races for port 9222.
83
- * This pgrep guard closes that window (issue #534, layer 3). Windows has no
84
- * pgrep, so we conservatively report "not running" and fall back to the CDP
85
- * probe there.
86
- */
87
- function isCdpChromeProcessRunning() {
81
+ function isCdpChromeProcessRunning(engine) {
88
82
  if (process.platform === "win32")
89
83
  return false;
84
+ const port = cdpPortFor(engine);
90
85
  try {
91
- const output = execSync(`pgrep -af -- '--remote-debugging-port=${CDP_PORT}'`, {
86
+ const output = execSync(`pgrep -af -- '--remote-debugging-port=${port}'`, {
92
87
  encoding: "utf-8",
93
88
  });
94
89
  return output
95
90
  .split(/\r?\n/)
96
- .some((line) => line.includes(`--remote-debugging-port=${CDP_PORT}`)
91
+ .some((line) => line.includes(`--remote-debugging-port=${port}`)
97
92
  && !line.includes("pgrep -af"));
98
93
  }
99
94
  catch {
100
- // pgrep exits non-zero when no matching process is found — expected.
101
95
  return false;
102
96
  }
103
97
  }
104
- /**
105
- * Kill any Chrome processes that were launched with our CDP port and
106
- * profile dir. Best-effort — failures are silently ignored.
107
- */
108
- function killChrome() {
98
+ function killChrome(engine) {
99
+ const port = cdpPortFor(engine);
109
100
  try {
110
101
  if (process.platform === "darwin" || process.platform === "linux") {
111
- execSync(`pkill -f -- '--remote-debugging-port=${CDP_PORT}'`, { stdio: "ignore" });
102
+ execSync(`pkill -f -- '--remote-debugging-port=${port}'`, { stdio: "ignore" });
112
103
  }
113
104
  else {
114
105
  execSync(`taskkill /F /IM chrome.exe`, { stdio: "ignore" });
@@ -118,75 +109,103 @@ function killChrome() {
118
109
  // pkill exits non-zero when no matching process is found — expected
119
110
  }
120
111
  }
121
- /**
122
- * Force-kill Chrome and wait for the CDP port to become free.
123
- */
124
- async function killAndWait() {
125
- killChrome();
126
- const deadline = Date.now() + 5_000;
112
+ async function killAndWait(engine) {
113
+ killChrome(engine);
114
+ const deadline = Date.now() + KILL_WAIT_MS;
127
115
  while (Date.now() < deadline) {
128
- if (!(await isCdpAlive()))
116
+ if (!(await isCdpAlive(engine)))
129
117
  return;
130
- await new Promise((r) => setTimeout(r, 300));
118
+ await new Promise((r) => setTimeout(r, CDP_POLL_INTERVAL_MS));
131
119
  }
132
- logger.warn("Chrome process did not exit within 5 s after kill signal");
120
+ logger.warn(`Browser process did not exit within ${KILL_WAIT_MS}ms after kill signal`);
133
121
  }
134
122
  /**
135
- * Launch the system Chrome as a persistent detached process with remote
136
- * debugging enabled and a dedicated user-data-dir. The process is unref'd
137
- * so the agent can exit without waiting for it, and the browser stays
138
- * visible on the desktop between wake cycles.
139
- *
140
- * Returns `true` if a new process was spawned, `false` if the browser
141
- * was already running.
123
+ * 1..2^31-1. The UA-CH patch parses the seed with StringToInt, which saturates
124
+ * at INT_MAX, so anything above 2^31-1 collapses to one version.
142
125
  */
143
- async function launchBrowser() {
126
+ export const FINGERPRINT_SEED_MAX = 0x7fff_ffff;
127
+ function randomFingerprintSeed() {
128
+ return randomInt(1, FINGERPRINT_SEED_MAX + 1);
129
+ }
130
+ /**
131
+ * One seed per profile, kept across restarts. A new machine gets a new file.
132
+ * Do not randomize per launch: the same host must keep the same fingerprint.
133
+ */
134
+ export function fingerprintSeed(seedPath = getFingerprintSeedPath()) {
135
+ try {
136
+ const parsed = Number(fs.readFileSync(seedPath, "utf-8").trim());
137
+ if (Number.isInteger(parsed) && parsed >= 1 && parsed <= FINGERPRINT_SEED_MAX)
138
+ return parsed;
139
+ }
140
+ catch {
141
+ // missing or unreadable: mint one below
142
+ }
143
+ const seed = randomFingerprintSeed();
144
+ fs.mkdirSync(path.dirname(seedPath), { recursive: true });
145
+ fs.writeFileSync(seedPath, `${seed}\n`, { mode: 0o600 });
146
+ return seed;
147
+ }
148
+ function launchFlags(selection) {
149
+ const engine = selection.engine;
150
+ const flags = [
151
+ `--remote-debugging-port=${cdpPortFor(engine)}`,
152
+ `--user-data-dir=${profileDirFor(engine)}`,
153
+ "--no-first-run",
154
+ "--no-default-browser-check",
155
+ "--profile-directory=Default",
156
+ ];
157
+ if (engine === "fingerprint") {
158
+ // The seed is the `--fingerprint` switch itself. Without it the binary
159
+ // does not pin UA-CH, GPU, or canvas noise to one identity.
160
+ flags.push(`--fingerprint=${fingerprintSeed()}`);
161
+ // GPU spoofing defaults to Windows when the seed is set and no platform is
162
+ // given (011-gpu-info.patch). UA-CH keeps the real platform unless this
163
+ // flag is set. Always pass the host so the two surfaces agree.
164
+ flags.push(`--fingerprint-platform=${fingerprintPlatform()}`);
165
+ }
166
+ if (isVirtualMachine()) {
167
+ flags.push("--disable-gpu", "--disable-software-rasterizer");
168
+ logger.system("VM detected — browser launched with GPU disabled");
169
+ }
170
+ if (process.platform === "linux") {
171
+ flags.push("--disable-dev-shm-usage");
172
+ if (engine === "stock" && process.env.VISIONCLAW_STATE_DIR === "/var/lib/visionclaw") {
173
+ flags.push("--disable-gpu", "--no-sandbox");
174
+ logger.system("Linux container detected — stock Chrome launched with container-isolation safeguards");
175
+ }
176
+ }
177
+ return flags;
178
+ }
179
+ async function launchBrowser(selection) {
144
180
  const capabilities = getHostCapabilities();
145
181
  if (!capabilities.browser.visible) {
146
182
  logger.warn("Visible Chrome requires an interactive desktop session");
147
183
  return false;
148
184
  }
149
- if (await isCdpAlive()) {
185
+ const engine = selection.engine;
186
+ if (await isCdpAlive(engine)) {
150
187
  return false;
151
188
  }
152
- // A Chrome may have been spawned already but not yet bound the CDP port
153
- // (isCdpAlive still false). Don't spawn a second one racing for port 9222 —
154
- // reuse the in-flight instance and let the readiness poll below pick it up.
155
- if (isCdpChromeProcessRunning()) {
156
- logger.system(`Chrome with CDP port ${CDP_PORT} already launching — reusing instead of double-launch`);
189
+ if (isCdpChromeProcessRunning(engine)) {
190
+ logger.system(`Browser with CDP port ${cdpPortFor(engine)} already launching — reusing instead of double-launch`);
157
191
  const deadline = Date.now() + CDP_STARTUP_TIMEOUT_MS;
158
192
  while (Date.now() < deadline) {
159
193
  await new Promise((r) => setTimeout(r, CDP_POLL_INTERVAL_MS));
160
- if (await isCdpAlive())
194
+ if (await isCdpAlive(engine))
161
195
  return false;
162
196
  }
163
- logger.warn(`Existing Chrome with CDP port ${CDP_PORT} not responding after ${CDP_STARTUP_TIMEOUT_MS}ms`);
197
+ logger.warn(`Existing browser with CDP port ${cdpPortFor(engine)} not responding after ${CDP_STARTUP_TIMEOUT_MS}ms`);
164
198
  return false;
165
199
  }
166
- if (!fs.existsSync(CHROME_PATH)) {
167
- logger.warn(`Chrome not found at ${CHROME_PATH}. Please install Google Chrome.`);
200
+ const chromePath = selection.executablePath;
201
+ if (!chromePath || !fs.existsSync(chromePath)) {
202
+ logger.warn(selection.reason === "fingerprint-unavailable"
203
+ ? "Fingerprint Chromium is not installed and stock Chrome was not found."
204
+ : `Browser not found at ${chromePath ?? "<unset>"}.`);
168
205
  return false;
169
206
  }
170
- const profileDir = getPlaywrightProfileDir();
171
- const flags = [
172
- `--remote-debugging-port=${CDP_PORT}`,
173
- `--user-data-dir=${profileDir}`,
174
- "--no-first-run",
175
- "--no-default-browser-check",
176
- "--profile-directory=Default",
177
- ];
178
- if (isVirtualMachine()) {
179
- flags.push("--disable-gpu", "--disable-software-rasterizer");
180
- logger.system("VM detected — Chrome launched with GPU disabled");
181
- }
182
- if (process.platform === "linux") {
183
- flags.push("--disable-dev-shm-usage");
184
- if (process.env.VISIONCLAW_STATE_DIR === "/var/lib/visionclaw") {
185
- flags.push("--disable-gpu", "--no-sandbox");
186
- logger.system("Linux container detected — Chrome launched with container-isolation safeguards");
187
- }
188
- }
189
- const child = spawn(CHROME_PATH, flags, {
207
+ const flags = launchFlags(selection);
208
+ const child = spawn(chromePath, flags, {
190
209
  detached: true,
191
210
  stdio: "ignore",
192
211
  env: process.env,
@@ -196,48 +215,58 @@ async function launchBrowser() {
196
215
  });
197
216
  child.unref();
198
217
  const deadline = Date.now() + CDP_STARTUP_TIMEOUT_MS;
199
- while (Date.now() < deadline) {
200
- await new Promise((r) => setTimeout(r, CDP_POLL_INTERVAL_MS));
201
- if (await isCdpAlive()) {
202
- logger.system(`Chrome launched on CDP port ${CDP_PORT}`);
218
+ do {
219
+ if (await isCdpAlive(engine)) {
220
+ logger.system(`${describeBrowserSelection(selection)} launched on loopback CDP port ${cdpPortFor(engine)}`);
203
221
  await new Promise((r) => setTimeout(r, NEW_BROWSER_SETTLE_MS));
204
222
  return true;
205
223
  }
206
- }
207
- logger.warn(`Chrome process spawned but CDP not responding after ${CDP_STARTUP_TIMEOUT_MS}ms`);
208
- return true;
224
+ if (Date.now() >= deadline)
225
+ break;
226
+ await new Promise((r) => setTimeout(r, CDP_POLL_INTERVAL_MS));
227
+ } while (Date.now() < deadline);
228
+ logger.warn(`Browser process spawned but CDP not responding after ${CDP_STARTUP_TIMEOUT_MS}ms`);
229
+ return false;
209
230
  }
210
- /**
211
- * Ensure a CDP-enabled Chrome is running with healthy page targets.
212
- * If page targets look unhealthy (crashed tabs, etc.) the browser is
213
- * killed and relaunched so Playwright's `connectOverCDP` doesn't hang.
214
- */
215
- export async function ensureBrowser() {
231
+ export async function ensureBrowser(config) {
232
+ const selection = resolveBrowserSelection(config);
233
+ activeSelection = selection;
234
+ // The engine that was not selected must not keep its loopback CDP listener.
235
+ // .playwriter-chrome used an ephemeral port and is not matched here.
236
+ const other = selection.engine === "fingerprint" ? "stock" : "fingerprint";
237
+ if (isCdpChromeProcessRunning(other) || await isCdpAlive(other)) {
238
+ logger.system(`Stopping ${other} browser on CDP port ${cdpPortFor(other)}; selected engine is ${selection.engine}`);
239
+ await killAndWait(other);
240
+ }
241
+ if (selection.reason === "fingerprint-unavailable") {
242
+ logger.system(`Fingerprint Chromium not installed — using stock Chrome (${selection.executablePath})`);
243
+ }
244
+ else if (selection.reason === "debug-stock") {
245
+ logger.system(`Browser engine: stock Chrome for debug (${selection.executablePath})`);
246
+ }
247
+ else if (selection.reason === "default-fingerprint") {
248
+ logger.system(`Browser engine: fingerprint Chromium (${selection.executablePath})`);
249
+ }
216
250
  try {
217
- if (await isCdpAlive()) {
218
- if (await arePagesHealthy()) {
251
+ if (await isCdpAlive(selection.engine)) {
252
+ if (await arePagesHealthy(selection.engine)) {
219
253
  logger.debug("Browser already running on CDP port");
220
254
  return;
221
255
  }
222
- logger.warn("CDP page targets unhealthy — restarting Chrome");
223
- await killAndWait();
256
+ logger.warn("CDP page targets unhealthy — restarting browser");
257
+ await killAndWait(selection.engine);
224
258
  }
225
- await launchBrowser();
259
+ await launchBrowser(selection);
226
260
  }
227
261
  catch (err) {
228
262
  logger.warn(`Failed to ensure browser: ${err instanceof Error ? err.message : String(err)}`);
229
263
  }
230
264
  }
231
- /**
232
- * Kill the current Chrome and launch a fresh instance. Called as a
233
- * recovery step when a Playwright MCP tool call times out.
234
- */
235
- export async function restartBrowser() {
236
- logger.system("Restarting Chrome for Playwright recovery");
237
- await killAndWait();
238
- await launchBrowser();
239
- }
240
- export function getCdpEndpoint() {
241
- return `http://127.0.0.1:${CDP_PORT}`;
265
+ export async function restartBrowser(config) {
266
+ const selection = resolveBrowserSelection(config);
267
+ activeSelection = selection;
268
+ logger.system("Restarting browser for Playwright recovery");
269
+ await killAndWait(selection.engine);
270
+ await launchBrowser(selection);
242
271
  }
243
272
  //# sourceMappingURL=browser-launcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-launcher.js","sourceRoot":"","sources":["../../src/agent/browser-launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-launcher.js","sourceRoot":"","sources":["../../src/agent/browser-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Dual-binary browser selection for Playwright CDP.
3
+ *
4
+ * Default: in-house fingerprint Chromium. Stock Chrome/chromium-browser is
5
+ * debug-only (owner asked for console/pageerror, fingerprint CDP failed, or
6
+ * VISIONCLAW_BROWSER=stock). Missing fingerprint binary never pretends to be
7
+ * fingerprint — we use stock Chrome and say so.
8
+ */
9
+ import type { VisionClawConfig } from "../config/types.js";
10
+ export type BrowserEngine = "fingerprint" | "stock";
11
+ export type BrowserSelectionReason = "default-fingerprint" | "debug-stock" | "fingerprint-unavailable" | "host-chrome-unavailable";
12
+ export interface BrowserSelection {
13
+ engine: BrowserEngine;
14
+ executablePath: string | undefined;
15
+ reason: BrowserSelectionReason;
16
+ /** True when the selected binary exists on disk. */
17
+ available: boolean;
18
+ }
19
+ export declare function findFingerprintExecutable(config?: Pick<VisionClawConfig, "browser">, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): string | undefined;
20
+ export declare function parseBrowserEngine(raw: string): BrowserEngine | undefined;
21
+ export declare function wantsStockChrome(config?: Pick<VisionClawConfig, "browser">, env?: NodeJS.ProcessEnv): boolean;
22
+ export declare function resolveBrowserSelection(config?: Pick<VisionClawConfig, "browser">, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): BrowserSelection;
23
+ export declare function describeBrowserSelection(selection: BrowserSelection): string;
24
+ //# sourceMappingURL=browser-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-selection.d.ts","sourceRoot":"","sources":["../../src/agent/browser-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,aAAa,GACb,yBAAyB,GACzB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;CACpB;AAaD,wBAAgB,yBAAyB,CACvC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAKzE;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED,wBAAgB,uBAAuB,CACrC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,gBAAgB,CAiClB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAW5E"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Dual-binary browser selection for Playwright CDP.
3
+ *
4
+ * Default: in-house fingerprint Chromium. Stock Chrome/chromium-browser is
5
+ * debug-only (owner asked for console/pageerror, fingerprint CDP failed, or
6
+ * VISIONCLAW_BROWSER=stock). Missing fingerprint binary never pretends to be
7
+ * fingerprint — we use stock Chrome and say so.
8
+ */
9
+ import fs from "node:fs";
10
+ import { findChromeExecutable } from "../system/host-capabilities.js";
11
+ const LINUX_FINGERPRINT_CANDIDATES = [
12
+ "/opt/fingerprint-chromium/chrome",
13
+ "/usr/lib/fingerprint-chromium/chrome",
14
+ "/usr/bin/fingerprint-chromium",
15
+ ];
16
+ const DARWIN_FINGERPRINT_CANDIDATES = [
17
+ "/Applications/Fingerprint Chromium.app/Contents/MacOS/Chromium",
18
+ "/Applications/Fingerprint Chromium.app/Contents/MacOS/chrome",
19
+ ];
20
+ export function findFingerprintExecutable(config, env = process.env, platform = process.platform) {
21
+ const configured = config?.browser?.fingerprintExecutablePath?.trim()
22
+ ?? env.FINGERPRINT_CHROMIUM_PATH?.trim();
23
+ if (configured && fs.existsSync(configured))
24
+ return configured;
25
+ const candidates = platform === "darwin"
26
+ ? DARWIN_FINGERPRINT_CANDIDATES
27
+ : platform === "linux"
28
+ ? LINUX_FINGERPRINT_CANDIDATES
29
+ : [];
30
+ return candidates.find((candidate) => fs.existsSync(candidate));
31
+ }
32
+ export function parseBrowserEngine(raw) {
33
+ const value = raw.trim().toLowerCase();
34
+ if (value === "fingerprint")
35
+ return "fingerprint";
36
+ if (value === "stock" || value === "chrome" || value === "debug")
37
+ return "stock";
38
+ return undefined;
39
+ }
40
+ export function wantsStockChrome(config, env = process.env) {
41
+ const engine = config?.browser?.engine ?? env.VISIONCLAW_BROWSER?.trim().toLowerCase();
42
+ return engine === "stock" || engine === "chrome" || engine === "debug";
43
+ }
44
+ export function resolveBrowserSelection(config, env = process.env, platform = process.platform) {
45
+ const stockPath = findChromeExecutable(platform);
46
+ if (wantsStockChrome(config, env)) {
47
+ return {
48
+ engine: "stock",
49
+ executablePath: stockPath,
50
+ reason: "debug-stock",
51
+ available: Boolean(stockPath),
52
+ };
53
+ }
54
+ const fingerprintPath = findFingerprintExecutable(config, env, platform);
55
+ if (fingerprintPath) {
56
+ return {
57
+ engine: "fingerprint",
58
+ executablePath: fingerprintPath,
59
+ reason: "default-fingerprint",
60
+ available: true,
61
+ };
62
+ }
63
+ if (stockPath) {
64
+ return {
65
+ engine: "stock",
66
+ executablePath: stockPath,
67
+ reason: "fingerprint-unavailable",
68
+ available: true,
69
+ };
70
+ }
71
+ return {
72
+ engine: "fingerprint",
73
+ executablePath: undefined,
74
+ reason: "host-chrome-unavailable",
75
+ available: false,
76
+ };
77
+ }
78
+ export function describeBrowserSelection(selection) {
79
+ if (selection.reason === "default-fingerprint") {
80
+ return `fingerprint Chromium (${selection.executablePath})`;
81
+ }
82
+ if (selection.reason === "debug-stock") {
83
+ return `stock Chrome for debug (${selection.executablePath ?? "missing"})`;
84
+ }
85
+ if (selection.reason === "fingerprint-unavailable") {
86
+ return `stock Chrome; fingerprint binary not installed (${selection.executablePath})`;
87
+ }
88
+ return "no browser binary (fingerprint missing, stock Chrome missing)";
89
+ }
90
+ //# sourceMappingURL=browser-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-selection.js","sourceRoot":"","sources":["../../src/agent/browser-selection.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/agent/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAahD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IACE,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EACF;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACrG;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqJ1B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB1B;AAyBD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,gBAAgB,CAAC;CACxB,GAAG,YAAY,EAAE,CA6BjB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,MAAM,EAAE,gBAAgB,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,YAAY,EAAE,CAsBjB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/agent/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAahD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IACE,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EACF;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACrG;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0K1B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB1B;AAyBD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,gBAAgB,CAAC;CACxB,GAAG,YAAY,EAAE,CA6BjB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,MAAM,EAAE,gBAAgB,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,YAAY,EAAE,CAsBjB"}