@hasna/browser 0.3.2 → 0.3.4

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 (225) hide show
  1. package/dist/cli/index.js +999 -299
  2. package/dist/index.js +75 -22
  3. package/dist/mcp/index.js +1086 -338
  4. package/dist/server/index.js +90 -40
  5. package/package.json +1 -1
  6. package/dashboard/dist/assets/index-Cy4XUbL1.js +0 -40
  7. package/dashboard/dist/index.html +0 -16
  8. package/dist/cli/commands/browse.d.ts +0 -3
  9. package/dist/cli/commands/browse.d.ts.map +0 -1
  10. package/dist/cli/commands/script.d.ts +0 -3
  11. package/dist/cli/commands/script.d.ts.map +0 -1
  12. package/dist/cli/commands/session.d.ts +0 -3
  13. package/dist/cli/commands/session.d.ts.map +0 -1
  14. package/dist/cli/commands/tools.d.ts +0 -3
  15. package/dist/cli/commands/tools.d.ts.map +0 -1
  16. package/dist/cli/index.d.ts +0 -3
  17. package/dist/cli/index.d.ts.map +0 -1
  18. package/dist/cli/index.test.d.ts +0 -2
  19. package/dist/cli/index.test.d.ts.map +0 -1
  20. package/dist/db/agents.d.ts +0 -16
  21. package/dist/db/agents.d.ts.map +0 -1
  22. package/dist/db/agents.test.d.ts +0 -2
  23. package/dist/db/agents.test.d.ts.map +0 -1
  24. package/dist/db/console-log.d.ts +0 -6
  25. package/dist/db/console-log.d.ts.map +0 -1
  26. package/dist/db/crawl-results.d.ts +0 -6
  27. package/dist/db/crawl-results.d.ts.map +0 -1
  28. package/dist/db/gallery.d.ts +0 -26
  29. package/dist/db/gallery.d.ts.map +0 -1
  30. package/dist/db/gallery.test.d.ts +0 -2
  31. package/dist/db/gallery.test.d.ts.map +0 -1
  32. package/dist/db/heartbeats.d.ts +0 -6
  33. package/dist/db/heartbeats.d.ts.map +0 -1
  34. package/dist/db/network-log.d.ts +0 -7
  35. package/dist/db/network-log.d.ts.map +0 -1
  36. package/dist/db/projects.d.ts +0 -9
  37. package/dist/db/projects.d.ts.map +0 -1
  38. package/dist/db/projects.test.d.ts +0 -2
  39. package/dist/db/projects.test.d.ts.map +0 -1
  40. package/dist/db/recordings.d.ts +0 -11
  41. package/dist/db/recordings.d.ts.map +0 -1
  42. package/dist/db/recordings.test.d.ts +0 -2
  43. package/dist/db/recordings.test.d.ts.map +0 -1
  44. package/dist/db/schema.d.ts +0 -5
  45. package/dist/db/schema.d.ts.map +0 -1
  46. package/dist/db/schema.test.d.ts +0 -2
  47. package/dist/db/schema.test.d.ts.map +0 -1
  48. package/dist/db/scripts.d.ts +0 -84
  49. package/dist/db/scripts.d.ts.map +0 -1
  50. package/dist/db/sessions.d.ts +0 -35
  51. package/dist/db/sessions.d.ts.map +0 -1
  52. package/dist/db/sessions.test.d.ts +0 -2
  53. package/dist/db/sessions.test.d.ts.map +0 -1
  54. package/dist/db/snapshots.d.ts +0 -7
  55. package/dist/db/snapshots.d.ts.map +0 -1
  56. package/dist/db/timeline.d.ts +0 -11
  57. package/dist/db/timeline.d.ts.map +0 -1
  58. package/dist/engines/bun-webview.d.ts +0 -147
  59. package/dist/engines/bun-webview.d.ts.map +0 -1
  60. package/dist/engines/bun-webview.test.d.ts +0 -2
  61. package/dist/engines/bun-webview.test.d.ts.map +0 -1
  62. package/dist/engines/cdp.d.ts +0 -27
  63. package/dist/engines/cdp.d.ts.map +0 -1
  64. package/dist/engines/lightpanda.d.ts +0 -25
  65. package/dist/engines/lightpanda.d.ts.map +0 -1
  66. package/dist/engines/playwright.d.ts +0 -27
  67. package/dist/engines/playwright.d.ts.map +0 -1
  68. package/dist/engines/selector.d.ts +0 -17
  69. package/dist/engines/selector.d.ts.map +0 -1
  70. package/dist/engines/selector.test.d.ts +0 -2
  71. package/dist/engines/selector.test.d.ts.map +0 -1
  72. package/dist/index.d.ts +0 -28
  73. package/dist/index.d.ts.map +0 -1
  74. package/dist/lib/actions-ref.test.d.ts +0 -2
  75. package/dist/lib/actions-ref.test.d.ts.map +0 -1
  76. package/dist/lib/actions.d.ts +0 -91
  77. package/dist/lib/actions.d.ts.map +0 -1
  78. package/dist/lib/actions.test.d.ts +0 -2
  79. package/dist/lib/actions.test.d.ts.map +0 -1
  80. package/dist/lib/agents.d.ts +0 -9
  81. package/dist/lib/agents.d.ts.map +0 -1
  82. package/dist/lib/agents.test.d.ts +0 -2
  83. package/dist/lib/agents.test.d.ts.map +0 -1
  84. package/dist/lib/ai-inference.d.ts +0 -21
  85. package/dist/lib/ai-inference.d.ts.map +0 -1
  86. package/dist/lib/ai-task.d.ts +0 -23
  87. package/dist/lib/ai-task.d.ts.map +0 -1
  88. package/dist/lib/annotate.d.ts +0 -18
  89. package/dist/lib/annotate.d.ts.map +0 -1
  90. package/dist/lib/annotate.test.d.ts +0 -2
  91. package/dist/lib/annotate.test.d.ts.map +0 -1
  92. package/dist/lib/api-detector.d.ts +0 -17
  93. package/dist/lib/api-detector.d.ts.map +0 -1
  94. package/dist/lib/auth-flow.d.ts +0 -43
  95. package/dist/lib/auth-flow.d.ts.map +0 -1
  96. package/dist/lib/auth.d.ts +0 -28
  97. package/dist/lib/auth.d.ts.map +0 -1
  98. package/dist/lib/console.d.ts +0 -6
  99. package/dist/lib/console.d.ts.map +0 -1
  100. package/dist/lib/coordination.d.ts +0 -12
  101. package/dist/lib/coordination.d.ts.map +0 -1
  102. package/dist/lib/crawler.d.ts +0 -3
  103. package/dist/lib/crawler.d.ts.map +0 -1
  104. package/dist/lib/cron-manager.d.ts +0 -43
  105. package/dist/lib/cron-manager.d.ts.map +0 -1
  106. package/dist/lib/daemon-client.d.ts +0 -16
  107. package/dist/lib/daemon-client.d.ts.map +0 -1
  108. package/dist/lib/datasets.d.ts +0 -33
  109. package/dist/lib/datasets.d.ts.map +0 -1
  110. package/dist/lib/deep-performance.d.ts +0 -49
  111. package/dist/lib/deep-performance.d.ts.map +0 -1
  112. package/dist/lib/dialogs.d.ts +0 -15
  113. package/dist/lib/dialogs.d.ts.map +0 -1
  114. package/dist/lib/downloads.d.ts +0 -15
  115. package/dist/lib/downloads.d.ts.map +0 -1
  116. package/dist/lib/downloads.test.d.ts +0 -2
  117. package/dist/lib/downloads.test.d.ts.map +0 -1
  118. package/dist/lib/env-detector.d.ts +0 -12
  119. package/dist/lib/env-detector.d.ts.map +0 -1
  120. package/dist/lib/extractor.d.ts +0 -22
  121. package/dist/lib/extractor.d.ts.map +0 -1
  122. package/dist/lib/extractor.test.d.ts +0 -2
  123. package/dist/lib/extractor.test.d.ts.map +0 -1
  124. package/dist/lib/files-integration.d.ts +0 -13
  125. package/dist/lib/files-integration.d.ts.map +0 -1
  126. package/dist/lib/gallery-diff.d.ts +0 -3
  127. package/dist/lib/gallery-diff.d.ts.map +0 -1
  128. package/dist/lib/integrations.test.d.ts +0 -2
  129. package/dist/lib/integrations.test.d.ts.map +0 -1
  130. package/dist/lib/login-scripts.d.ts +0 -89
  131. package/dist/lib/login-scripts.d.ts.map +0 -1
  132. package/dist/lib/network.d.ts +0 -11
  133. package/dist/lib/network.d.ts.map +0 -1
  134. package/dist/lib/network.test.d.ts +0 -2
  135. package/dist/lib/network.test.d.ts.map +0 -1
  136. package/dist/lib/page-memory.d.ts +0 -14
  137. package/dist/lib/page-memory.d.ts.map +0 -1
  138. package/dist/lib/performance.d.ts +0 -13
  139. package/dist/lib/performance.d.ts.map +0 -1
  140. package/dist/lib/profiles.d.ts +0 -23
  141. package/dist/lib/profiles.d.ts.map +0 -1
  142. package/dist/lib/qol.test.d.ts +0 -2
  143. package/dist/lib/qol.test.d.ts.map +0 -1
  144. package/dist/lib/recorder.d.ts +0 -11
  145. package/dist/lib/recorder.d.ts.map +0 -1
  146. package/dist/lib/recorder.test.d.ts +0 -2
  147. package/dist/lib/recorder.test.d.ts.map +0 -1
  148. package/dist/lib/ref-cache.d.ts +0 -9
  149. package/dist/lib/ref-cache.d.ts.map +0 -1
  150. package/dist/lib/sanitize.d.ts +0 -21
  151. package/dist/lib/sanitize.d.ts.map +0 -1
  152. package/dist/lib/screenshot-v4.test.d.ts +0 -2
  153. package/dist/lib/screenshot-v4.test.d.ts.map +0 -1
  154. package/dist/lib/screenshot.d.ts +0 -11
  155. package/dist/lib/screenshot.d.ts.map +0 -1
  156. package/dist/lib/screenshot.test.d.ts +0 -2
  157. package/dist/lib/screenshot.test.d.ts.map +0 -1
  158. package/dist/lib/script-engine.d.ts +0 -28
  159. package/dist/lib/script-engine.d.ts.map +0 -1
  160. package/dist/lib/self-heal.d.ts +0 -18
  161. package/dist/lib/self-heal.d.ts.map +0 -1
  162. package/dist/lib/session-v3.test.d.ts +0 -2
  163. package/dist/lib/session-v3.test.d.ts.map +0 -1
  164. package/dist/lib/session.d.ts +0 -38
  165. package/dist/lib/session.d.ts.map +0 -1
  166. package/dist/lib/skills-runner.d.ts +0 -14
  167. package/dist/lib/skills-runner.d.ts.map +0 -1
  168. package/dist/lib/snapshot-diff.test.d.ts +0 -2
  169. package/dist/lib/snapshot-diff.test.d.ts.map +0 -1
  170. package/dist/lib/snapshot.d.ts +0 -34
  171. package/dist/lib/snapshot.d.ts.map +0 -1
  172. package/dist/lib/snapshot.test.d.ts +0 -2
  173. package/dist/lib/snapshot.test.d.ts.map +0 -1
  174. package/dist/lib/stealth.d.ts +0 -5
  175. package/dist/lib/stealth.d.ts.map +0 -1
  176. package/dist/lib/stealth.test.d.ts +0 -2
  177. package/dist/lib/stealth.test.d.ts.map +0 -1
  178. package/dist/lib/storage-state.d.ts +0 -15
  179. package/dist/lib/storage-state.d.ts.map +0 -1
  180. package/dist/lib/storage.d.ts +0 -19
  181. package/dist/lib/storage.d.ts.map +0 -1
  182. package/dist/lib/structured-extract.d.ts +0 -26
  183. package/dist/lib/structured-extract.d.ts.map +0 -1
  184. package/dist/lib/tabs.d.ts +0 -18
  185. package/dist/lib/tabs.d.ts.map +0 -1
  186. package/dist/lib/task-queue.d.ts +0 -21
  187. package/dist/lib/task-queue.d.ts.map +0 -1
  188. package/dist/lib/url-watcher.d.ts +0 -33
  189. package/dist/lib/url-watcher.d.ts.map +0 -1
  190. package/dist/lib/vision-fallback.d.ts +0 -29
  191. package/dist/lib/vision-fallback.d.ts.map +0 -1
  192. package/dist/lib/workflows.d.ts +0 -46
  193. package/dist/lib/workflows.d.ts.map +0 -1
  194. package/dist/mcp/actions.d.ts +0 -3
  195. package/dist/mcp/actions.d.ts.map +0 -1
  196. package/dist/mcp/capture.d.ts +0 -3
  197. package/dist/mcp/capture.d.ts.map +0 -1
  198. package/dist/mcp/data.d.ts +0 -3
  199. package/dist/mcp/data.d.ts.map +0 -1
  200. package/dist/mcp/gallery.test.d.ts +0 -2
  201. package/dist/mcp/gallery.test.d.ts.map +0 -1
  202. package/dist/mcp/helpers.d.ts +0 -55
  203. package/dist/mcp/helpers.d.ts.map +0 -1
  204. package/dist/mcp/index.d.ts +0 -3
  205. package/dist/mcp/index.d.ts.map +0 -1
  206. package/dist/mcp/index.test.d.ts +0 -2
  207. package/dist/mcp/index.test.d.ts.map +0 -1
  208. package/dist/mcp/meta.d.ts +0 -3
  209. package/dist/mcp/meta.d.ts.map +0 -1
  210. package/dist/mcp/network.d.ts +0 -3
  211. package/dist/mcp/network.d.ts.map +0 -1
  212. package/dist/mcp/recordings.d.ts +0 -3
  213. package/dist/mcp/recordings.d.ts.map +0 -1
  214. package/dist/mcp/scripts.d.ts +0 -3
  215. package/dist/mcp/scripts.d.ts.map +0 -1
  216. package/dist/mcp/sessions.d.ts +0 -3
  217. package/dist/mcp/sessions.d.ts.map +0 -1
  218. package/dist/mcp/v4.test.d.ts +0 -2
  219. package/dist/mcp/v4.test.d.ts.map +0 -1
  220. package/dist/server/index.d.ts +0 -2
  221. package/dist/server/index.d.ts.map +0 -1
  222. package/dist/server/index.test.d.ts +0 -2
  223. package/dist/server/index.test.d.ts.map +0 -1
  224. package/dist/types/index.d.ts +0 -425
  225. package/dist/types/index.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -4,25 +4,43 @@ var __getProtoOf = Object.getPrototypeOf;
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
7
12
  var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
8
20
  target = mod != null ? __create(__getProtoOf(mod)) : {};
9
21
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
22
  for (let key of __getOwnPropNames(mod))
11
23
  if (!__hasOwnProp.call(to, key))
12
24
  __defProp(to, key, {
13
- get: () => mod[key],
25
+ get: __accessProp.bind(mod, key),
14
26
  enumerable: true
15
27
  });
28
+ if (canCache)
29
+ cache.set(mod, to);
16
30
  return to;
17
31
  };
18
32
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
33
+ var __returnValue = (v) => v;
34
+ function __exportSetter(name, newValue) {
35
+ this[name] = __returnValue.bind(null, newValue);
36
+ }
19
37
  var __export = (target, all) => {
20
38
  for (var name in all)
21
39
  __defProp(target, name, {
22
40
  get: all[name],
23
41
  enumerable: true,
24
42
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
43
+ set: __exportSetter.bind(all, name)
26
44
  });
27
45
  };
28
46
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -104,10 +122,30 @@ var init_types = __esm(() => {
104
122
  // src/db/schema.ts
105
123
  import { Database } from "bun:sqlite";
106
124
  import { join } from "path";
107
- import { mkdirSync } from "fs";
125
+ import { mkdirSync, existsSync, readdirSync, copyFileSync, statSync } from "fs";
108
126
  import { homedir } from "os";
109
127
  function getDataDir() {
110
- return process.env["BROWSER_DATA_DIR"] ?? join(homedir(), ".browser");
128
+ if (process.env["BROWSER_DATA_DIR"])
129
+ return process.env["BROWSER_DATA_DIR"];
130
+ const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
131
+ const newDir = join(home, ".hasna", "browser");
132
+ const oldDir = join(home, ".browser");
133
+ if (existsSync(oldDir) && !existsSync(newDir)) {
134
+ mkdirSync(newDir, { recursive: true });
135
+ try {
136
+ for (const file of readdirSync(oldDir)) {
137
+ const oldPath = join(oldDir, file);
138
+ const newPath = join(newDir, file);
139
+ try {
140
+ if (statSync(oldPath).isFile()) {
141
+ copyFileSync(oldPath, newPath);
142
+ }
143
+ } catch {}
144
+ }
145
+ } catch {}
146
+ }
147
+ mkdirSync(newDir, { recursive: true });
148
+ return newDir;
111
149
  }
112
150
  function getDatabase(path) {
113
151
  const resolvedPath = path ?? process.env["BROWSER_DB_PATH"] ?? join(getDataDir(), "browser.db");
@@ -608,9 +646,8 @@ __export(exports_storage_state, {
608
646
  listStates: () => listStates,
609
647
  deleteState: () => deleteState
610
648
  });
611
- import { mkdirSync as mkdirSync3, existsSync, readdirSync, unlinkSync } from "fs";
649
+ import { mkdirSync as mkdirSync3, existsSync as existsSync2, readdirSync as readdirSync2, unlinkSync } from "fs";
612
650
  import { join as join3 } from "path";
613
- import { homedir as homedir3 } from "os";
614
651
  function ensureDir() {
615
652
  mkdirSync3(STATES_DIR, { recursive: true });
616
653
  }
@@ -628,11 +665,11 @@ async function saveStateFromPage(page, name) {
628
665
  }
629
666
  function loadStatePath(name) {
630
667
  const path = statePath(name);
631
- return existsSync(path) ? path : null;
668
+ return existsSync2(path) ? path : null;
632
669
  }
633
670
  function listStates() {
634
671
  ensureDir();
635
- return readdirSync(STATES_DIR).filter((f) => f.endsWith(".json")).map((f) => {
672
+ return readdirSync2(STATES_DIR).filter((f) => f.endsWith(".json")).map((f) => {
636
673
  const path = join3(STATES_DIR, f);
637
674
  const stat = Bun.file(path);
638
675
  return {
@@ -644,7 +681,7 @@ function listStates() {
644
681
  }
645
682
  function deleteState(name) {
646
683
  const path = statePath(name);
647
- if (existsSync(path)) {
684
+ if (existsSync2(path)) {
648
685
  unlinkSync(path);
649
686
  return true;
650
687
  }
@@ -652,7 +689,8 @@ function deleteState(name) {
652
689
  }
653
690
  var STATES_DIR;
654
691
  var init_storage_state = __esm(() => {
655
- STATES_DIR = join3(process.env["BROWSER_DATA_DIR"] ?? join3(homedir3(), ".browser"), "states");
692
+ init_schema();
693
+ STATES_DIR = join3(getDataDir(), "states");
656
694
  });
657
695
 
658
696
  // node_modules/sharp/lib/is.js
@@ -7494,10 +7532,15 @@ class BrowserPool {
7494
7532
  this.pool.push({ browser, inUse: true, createdAt: Date.now() });
7495
7533
  return browser;
7496
7534
  }
7497
- return new Promise((resolve) => {
7535
+ return new Promise((resolve, reject) => {
7536
+ const timeout = setTimeout(() => {
7537
+ clearInterval(interval);
7538
+ reject(new BrowserError("Browser pool exhausted \u2014 no browser became available within 30s", "POOL_TIMEOUT", true));
7539
+ }, 30000);
7498
7540
  const interval = setInterval(() => {
7499
7541
  const free = this.pool.find((e) => !e.inUse);
7500
7542
  if (free) {
7543
+ clearTimeout(timeout);
7501
7544
  clearInterval(interval);
7502
7545
  free.inUse = true;
7503
7546
  resolve(free.browser);
@@ -7539,7 +7582,7 @@ function isLightpandaAvailable() {
7539
7582
  const paths = [
7540
7583
  "/usr/local/bin/lightpanda",
7541
7584
  "/usr/bin/lightpanda",
7542
- `${process.env["HOME"]}/.browser/bin/lightpanda`
7585
+ `${process.env["HOME"]}/.hasna/browser/bin/lightpanda`
7543
7586
  ];
7544
7587
  return paths.some((p) => {
7545
7588
  try {
@@ -7558,7 +7601,7 @@ function getLightpandaBinaryPath() {
7558
7601
  "lightpanda",
7559
7602
  "/usr/local/bin/lightpanda",
7560
7603
  "/usr/bin/lightpanda",
7561
- `${process.env["HOME"]}/.browser/bin/lightpanda`
7604
+ `${process.env["HOME"]}/.hasna/browser/bin/lightpanda`
7562
7605
  ];
7563
7606
  for (const p of paths) {
7564
7607
  try {
@@ -7672,14 +7715,14 @@ class LightpandaPage {
7672
7715
  init_types();
7673
7716
 
7674
7717
  // src/engines/bun-webview.ts
7718
+ init_schema();
7675
7719
  import { join as join2 } from "path";
7676
7720
  import { mkdirSync as mkdirSync2 } from "fs";
7677
- import { homedir as homedir2 } from "os";
7678
7721
  function isBunWebViewAvailable() {
7679
7722
  return typeof globalThis.Bun !== "undefined" && typeof globalThis.Bun.WebView !== "undefined";
7680
7723
  }
7681
7724
  function getProfileDir(profileName) {
7682
- const base = process.env["BROWSER_DATA_DIR"] ?? join2(homedir2(), ".browser");
7725
+ const base = getDataDir();
7683
7726
  const dir = join2(base, "profiles", profileName);
7684
7727
  mkdirSync2(dir, { recursive: true });
7685
7728
  return dir;
@@ -8156,6 +8199,7 @@ function enableNetworkLogging(page, sessionId) {
8156
8199
  };
8157
8200
  const onResponse = (res) => {
8158
8201
  const start = requestStart.get(res.url()) ?? Date.now();
8202
+ requestStart.delete(res.url());
8159
8203
  const duration = Date.now() - start;
8160
8204
  const req = res.request();
8161
8205
  try {
@@ -8172,11 +8216,17 @@ function enableNetworkLogging(page, sessionId) {
8172
8216
  });
8173
8217
  } catch {}
8174
8218
  };
8219
+ const onRequestFailed = (req) => {
8220
+ requestStart.delete(req.url());
8221
+ };
8175
8222
  page.on("request", onRequest);
8176
8223
  page.on("response", onResponse);
8224
+ page.on("requestfailed", onRequestFailed);
8177
8225
  return () => {
8178
8226
  page.off("request", onRequest);
8179
8227
  page.off("response", onResponse);
8228
+ page.off("requestfailed", onRequestFailed);
8229
+ requestStart.clear();
8180
8230
  };
8181
8231
  }
8182
8232
  async function addInterceptRule(page, rule) {
@@ -8213,6 +8263,7 @@ function startHAR(page) {
8213
8263
  const start = requestStart.get(key);
8214
8264
  if (!start)
8215
8265
  return;
8266
+ requestStart.delete(key);
8216
8267
  const duration = Date.now() - start.time;
8217
8268
  const entry = {
8218
8269
  startedDateTime: new Date(start.time).toISOString(),
@@ -8235,15 +8286,20 @@ function startHAR(page) {
8235
8286
  timings: { send: 0, wait: duration, receive: 0 }
8236
8287
  };
8237
8288
  entries.push(entry);
8238
- requestStart.delete(key);
8289
+ };
8290
+ const onRequestFailed = (req) => {
8291
+ requestStart.delete(req.url() + req.method());
8239
8292
  };
8240
8293
  page.on("request", onRequest);
8241
8294
  page.on("response", onResponse);
8295
+ page.on("requestfailed", onRequestFailed);
8242
8296
  return {
8243
8297
  entries,
8244
8298
  stop: () => {
8245
8299
  page.off("request", onRequest);
8246
8300
  page.off("response", onResponse);
8301
+ page.off("requestfailed", onRequestFailed);
8302
+ requestStart.clear();
8247
8303
  return {
8248
8304
  log: {
8249
8305
  version: "1.2",
@@ -9401,7 +9457,6 @@ init_types();
9401
9457
  var import_sharp = __toESM(require_lib(), 1);
9402
9458
  import { join as join4 } from "path";
9403
9459
  import { mkdirSync as mkdirSync4 } from "fs";
9404
- import { homedir as homedir4 } from "os";
9405
9460
 
9406
9461
  // src/db/gallery.ts
9407
9462
  init_schema();
@@ -9446,11 +9501,9 @@ function getEntry(id) {
9446
9501
  }
9447
9502
 
9448
9503
  // src/lib/screenshot.ts
9449
- function getDataDir2() {
9450
- return process.env["BROWSER_DATA_DIR"] ?? join4(homedir4(), ".browser");
9451
- }
9504
+ init_schema();
9452
9505
  function getScreenshotDir(projectId) {
9453
- const base = join4(getDataDir2(), "screenshots");
9506
+ const base = join4(getDataDir(), "screenshots");
9454
9507
  const date = new Date().toISOString().split("T")[0];
9455
9508
  const dir = projectId ? join4(base, projectId, date) : join4(base, date);
9456
9509
  mkdirSync4(dir, { recursive: true });
@@ -9585,7 +9638,7 @@ async function takeScreenshot(page, opts) {
9585
9638
  }
9586
9639
  async function generatePDF(page, opts) {
9587
9640
  try {
9588
- const base = join4(getDataDir2(), "pdfs");
9641
+ const base = join4(getDataDir(), "pdfs");
9589
9642
  const date = new Date().toISOString().split("T")[0];
9590
9643
  const dir = opts?.projectId ? join4(base, opts.projectId, date) : join4(base, date);
9591
9644
  mkdirSync4(dir, { recursive: true });