openchrome-mcp 1.10.2 → 1.10.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 (406) hide show
  1. package/README.md +56 -15
  2. package/assets/badges/mseep.png +0 -0
  3. package/dist/actions/action-parser.js +1 -1
  4. package/dist/actions/action-parser.js.map +1 -1
  5. package/dist/chrome/exit-classifier.d.ts +66 -0
  6. package/dist/chrome/exit-classifier.d.ts.map +1 -0
  7. package/dist/chrome/exit-classifier.js +97 -0
  8. package/dist/chrome/exit-classifier.js.map +1 -0
  9. package/dist/chrome/launch-mode-resolver.d.ts +78 -0
  10. package/dist/chrome/launch-mode-resolver.d.ts.map +1 -0
  11. package/dist/chrome/launch-mode-resolver.js +108 -0
  12. package/dist/chrome/launch-mode-resolver.js.map +1 -0
  13. package/dist/chrome/launcher.d.ts +40 -0
  14. package/dist/chrome/launcher.d.ts.map +1 -1
  15. package/dist/chrome/launcher.js +174 -16
  16. package/dist/chrome/launcher.js.map +1 -1
  17. package/dist/chrome/ownership-marker.d.ts +86 -0
  18. package/dist/chrome/ownership-marker.d.ts.map +1 -0
  19. package/dist/chrome/ownership-marker.js +329 -0
  20. package/dist/chrome/ownership-marker.js.map +1 -0
  21. package/dist/chrome/pool.d.ts.map +1 -1
  22. package/dist/chrome/pool.js.map +1 -1
  23. package/dist/chrome/process-detector.d.ts +49 -0
  24. package/dist/chrome/process-detector.d.ts.map +1 -0
  25. package/dist/chrome/process-detector.js +241 -0
  26. package/dist/chrome/process-detector.js.map +1 -0
  27. package/dist/chrome/process-watchdog.d.ts.map +1 -1
  28. package/dist/chrome/process-watchdog.js +17 -1
  29. package/dist/chrome/process-watchdog.js.map +1 -1
  30. package/dist/cli/claude-cli.d.ts +23 -0
  31. package/dist/cli/claude-cli.js +31 -0
  32. package/dist/cli/claude-cli.js.map +1 -0
  33. package/dist/cli/claude-session.js +3 -2
  34. package/dist/cli/claude-session.js.map +1 -1
  35. package/dist/cli/index.js +46 -9
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/mcp-client-config.d.ts +13 -1
  38. package/dist/cli/mcp-client-config.js +33 -2
  39. package/dist/cli/mcp-client-config.js.map +1 -1
  40. package/dist/cli/replay-server.d.ts +34 -0
  41. package/dist/cli/replay-server.js +215 -0
  42. package/dist/cli/replay-server.js.map +1 -0
  43. package/dist/cli/skill.d.ts +14 -0
  44. package/dist/cli/skill.js +179 -0
  45. package/dist/cli/skill.js.map +1 -0
  46. package/dist/cli/trace.d.ts +16 -0
  47. package/dist/cli/trace.js +270 -0
  48. package/dist/cli/trace.js.map +1 -0
  49. package/dist/config/defaults.d.ts +11 -0
  50. package/dist/config/defaults.d.ts.map +1 -1
  51. package/dist/config/defaults.js +49 -3
  52. package/dist/config/defaults.js.map +1 -1
  53. package/dist/config/global.d.ts +10 -1
  54. package/dist/config/global.d.ts.map +1 -1
  55. package/dist/config/global.js.map +1 -1
  56. package/dist/config/headless-resolver.d.ts +39 -0
  57. package/dist/config/headless-resolver.d.ts.map +1 -0
  58. package/dist/config/headless-resolver.js +55 -0
  59. package/dist/config/headless-resolver.js.map +1 -0
  60. package/dist/config/tool-tiers.d.ts.map +1 -1
  61. package/dist/config/tool-tiers.js +3 -1
  62. package/dist/config/tool-tiers.js.map +1 -1
  63. package/dist/contracts/evaluator.d.ts +58 -0
  64. package/dist/contracts/evaluator.d.ts.map +1 -0
  65. package/dist/contracts/evaluator.js +151 -0
  66. package/dist/contracts/evaluator.js.map +1 -0
  67. package/dist/contracts/evidence.d.ts +122 -0
  68. package/dist/contracts/evidence.d.ts.map +1 -0
  69. package/dist/contracts/evidence.js +276 -0
  70. package/dist/contracts/evidence.js.map +1 -0
  71. package/dist/contracts/handoff/banner.d.ts +53 -0
  72. package/dist/contracts/handoff/banner.d.ts.map +1 -0
  73. package/dist/contracts/handoff/banner.js +136 -0
  74. package/dist/contracts/handoff/banner.js.map +1 -0
  75. package/dist/contracts/handoff/index.d.ts +11 -0
  76. package/dist/contracts/handoff/index.d.ts.map +1 -0
  77. package/dist/contracts/handoff/index.js +24 -0
  78. package/dist/contracts/handoff/index.js.map +1 -0
  79. package/dist/contracts/handoff/manager.d.ts +104 -0
  80. package/dist/contracts/handoff/manager.d.ts.map +1 -0
  81. package/dist/contracts/handoff/manager.js +184 -0
  82. package/dist/contracts/handoff/manager.js.map +1 -0
  83. package/dist/contracts/handoff/persistence.d.ts +76 -0
  84. package/dist/contracts/handoff/persistence.d.ts.map +1 -0
  85. package/dist/contracts/handoff/persistence.js +251 -0
  86. package/dist/contracts/handoff/persistence.js.map +1 -0
  87. package/dist/contracts/handoff/token.d.ts +22 -0
  88. package/dist/contracts/handoff/token.d.ts.map +1 -0
  89. package/dist/contracts/handoff/token.js +76 -0
  90. package/dist/contracts/handoff/token.js.map +1 -0
  91. package/dist/contracts/idempotency.d.ts +61 -0
  92. package/dist/contracts/idempotency.d.ts.map +1 -0
  93. package/dist/contracts/idempotency.js +182 -0
  94. package/dist/contracts/idempotency.js.map +1 -0
  95. package/dist/contracts/index.d.ts +22 -0
  96. package/dist/contracts/index.d.ts.map +1 -0
  97. package/dist/contracts/index.js +50 -0
  98. package/dist/contracts/index.js.map +1 -0
  99. package/dist/contracts/phash.d.ts +54 -0
  100. package/dist/contracts/phash.d.ts.map +1 -0
  101. package/dist/contracts/phash.js +117 -0
  102. package/dist/contracts/phash.js.map +1 -0
  103. package/dist/contracts/runtime.d.ts +166 -0
  104. package/dist/contracts/runtime.d.ts.map +1 -0
  105. package/dist/contracts/runtime.js +418 -0
  106. package/dist/contracts/runtime.js.map +1 -0
  107. package/dist/contracts/screenshot-classes.d.ts +78 -0
  108. package/dist/contracts/screenshot-classes.d.ts.map +1 -0
  109. package/dist/contracts/screenshot-classes.js +211 -0
  110. package/dist/contracts/screenshot-classes.js.map +1 -0
  111. package/dist/contracts/types.d.ts +85 -0
  112. package/dist/contracts/types.d.ts.map +1 -0
  113. package/dist/contracts/types.js +36 -0
  114. package/dist/contracts/types.js.map +1 -0
  115. package/dist/contracts/validator.d.ts +28 -0
  116. package/dist/contracts/validator.d.ts.map +1 -0
  117. package/dist/contracts/validator.js +212 -0
  118. package/dist/contracts/validator.js.map +1 -0
  119. package/dist/dashboard/index.d.ts.map +1 -1
  120. package/dist/dashboard/index.js +2 -2
  121. package/dist/dashboard/index.js.map +1 -1
  122. package/dist/dashboard/renderer.js.map +1 -1
  123. package/dist/dashboard/views/connect-view.js.map +1 -1
  124. package/dist/dashboard/views/sessions-view.js.map +1 -1
  125. package/dist/desktop/dashboard-state.d.ts.map +1 -1
  126. package/dist/desktop/dashboard-state.js.map +1 -1
  127. package/dist/dom/dom-serializer.d.ts.map +1 -1
  128. package/dist/dom/dom-serializer.js +13 -2
  129. package/dist/dom/dom-serializer.js.map +1 -1
  130. package/dist/index.js +57 -9
  131. package/dist/index.js.map +1 -1
  132. package/dist/mcp-server.d.ts.map +1 -1
  133. package/dist/mcp-server.js +23 -7
  134. package/dist/mcp-server.js.map +1 -1
  135. package/dist/memory/domain-memory.d.ts.map +1 -1
  136. package/dist/memory/domain-memory.js.map +1 -1
  137. package/dist/middleware/dashboard-authz.d.ts +18 -0
  138. package/dist/middleware/dashboard-authz.d.ts.map +1 -0
  139. package/dist/middleware/dashboard-authz.js +39 -0
  140. package/dist/middleware/dashboard-authz.js.map +1 -0
  141. package/dist/orchestration/state-manager.d.ts.map +1 -1
  142. package/dist/orchestration/state-manager.js.map +1 -1
  143. package/dist/perception/cache.d.ts +48 -0
  144. package/dist/perception/cache.d.ts.map +1 -0
  145. package/dist/perception/cache.js +74 -0
  146. package/dist/perception/cache.js.map +1 -0
  147. package/dist/perception/cross-check.d.ts +55 -0
  148. package/dist/perception/cross-check.d.ts.map +1 -0
  149. package/dist/perception/cross-check.js +74 -0
  150. package/dist/perception/cross-check.js.map +1 -0
  151. package/dist/perception/image-features.d.ts +58 -0
  152. package/dist/perception/image-features.d.ts.map +1 -0
  153. package/dist/perception/image-features.js +148 -0
  154. package/dist/perception/image-features.js.map +1 -0
  155. package/dist/perception/index.d.ts +16 -0
  156. package/dist/perception/index.d.ts.map +1 -0
  157. package/dist/perception/index.js +32 -0
  158. package/dist/perception/index.js.map +1 -0
  159. package/dist/perception/metadata.d.ts +23 -0
  160. package/dist/perception/metadata.d.ts.map +1 -0
  161. package/dist/perception/metadata.js +117 -0
  162. package/dist/perception/metadata.js.map +1 -0
  163. package/dist/perception/types.d.ts +77 -0
  164. package/dist/perception/types.d.ts.map +1 -0
  165. package/dist/perception/types.js +10 -0
  166. package/dist/perception/types.js.map +1 -0
  167. package/dist/perception/voting/args-equivalence.d.ts +36 -0
  168. package/dist/perception/voting/args-equivalence.d.ts.map +1 -0
  169. package/dist/perception/voting/args-equivalence.js +163 -0
  170. package/dist/perception/voting/args-equivalence.js.map +1 -0
  171. package/dist/perception/voting/index.d.ts +9 -0
  172. package/dist/perception/voting/index.d.ts.map +1 -0
  173. package/dist/perception/voting/index.js +18 -0
  174. package/dist/perception/voting/index.js.map +1 -0
  175. package/dist/perception/voting/orchestrator.d.ts +118 -0
  176. package/dist/perception/voting/orchestrator.d.ts.map +1 -0
  177. package/dist/perception/voting/orchestrator.js +200 -0
  178. package/dist/perception/voting/orchestrator.js.map +1 -0
  179. package/dist/perception/voting/providers/anthropic.d.ts +40 -0
  180. package/dist/perception/voting/providers/anthropic.d.ts.map +1 -0
  181. package/dist/perception/voting/providers/anthropic.js +91 -0
  182. package/dist/perception/voting/providers/anthropic.js.map +1 -0
  183. package/dist/perception/voting/providers/http-helpers.d.ts +49 -0
  184. package/dist/perception/voting/providers/http-helpers.d.ts.map +1 -0
  185. package/dist/perception/voting/providers/http-helpers.js +131 -0
  186. package/dist/perception/voting/providers/http-helpers.js.map +1 -0
  187. package/dist/perception/voting/providers/index.d.ts +13 -0
  188. package/dist/perception/voting/providers/index.d.ts.map +1 -0
  189. package/dist/perception/voting/providers/index.js +24 -0
  190. package/dist/perception/voting/providers/index.js.map +1 -0
  191. package/dist/perception/voting/providers/openai.d.ts +31 -0
  192. package/dist/perception/voting/providers/openai.d.ts.map +1 -0
  193. package/dist/perception/voting/providers/openai.js +88 -0
  194. package/dist/perception/voting/providers/openai.js.map +1 -0
  195. package/dist/resources/trace-resource.d.ts +50 -0
  196. package/dist/resources/trace-resource.d.ts.map +1 -0
  197. package/dist/resources/trace-resource.js +214 -0
  198. package/dist/resources/trace-resource.js.map +1 -0
  199. package/dist/router/cookie-sync.d.ts.map +1 -1
  200. package/dist/session-manager.d.ts.map +1 -1
  201. package/dist/session-manager.js +1 -0
  202. package/dist/session-manager.js.map +1 -1
  203. package/dist/skill/audit.d.ts +55 -0
  204. package/dist/skill/audit.d.ts.map +1 -0
  205. package/dist/skill/audit.js +70 -0
  206. package/dist/skill/audit.js.map +1 -0
  207. package/dist/skill/executor.d.ts +117 -0
  208. package/dist/skill/executor.d.ts.map +1 -0
  209. package/dist/skill/executor.js +233 -0
  210. package/dist/skill/executor.js.map +1 -0
  211. package/dist/skill/index.d.ts +17 -0
  212. package/dist/skill/index.d.ts.map +1 -0
  213. package/dist/skill/index.js +27 -0
  214. package/dist/skill/index.js.map +1 -0
  215. package/dist/skill/interactive-filter.d.ts +25 -0
  216. package/dist/skill/interactive-filter.d.ts.map +1 -0
  217. package/dist/skill/interactive-filter.js +57 -0
  218. package/dist/skill/interactive-filter.js.map +1 -0
  219. package/dist/skill/state.d.ts +73 -0
  220. package/dist/skill/state.d.ts.map +1 -0
  221. package/dist/skill/state.js +153 -0
  222. package/dist/skill/state.js.map +1 -0
  223. package/dist/skill/storage.d.ts +123 -0
  224. package/dist/skill/storage.d.ts.map +1 -0
  225. package/dist/skill/storage.js +316 -0
  226. package/dist/skill/storage.js.map +1 -0
  227. package/dist/skill/url-normalizer.d.ts +31 -0
  228. package/dist/skill/url-normalizer.d.ts.map +1 -0
  229. package/dist/skill/url-normalizer.js +73 -0
  230. package/dist/skill/url-normalizer.js.map +1 -0
  231. package/dist/skill-memory/audit-stats.d.ts +51 -0
  232. package/dist/skill-memory/audit-stats.d.ts.map +1 -0
  233. package/dist/skill-memory/audit-stats.js +189 -0
  234. package/dist/skill-memory/audit-stats.js.map +1 -0
  235. package/dist/skill-memory/curator-lock.d.ts +56 -0
  236. package/dist/skill-memory/curator-lock.d.ts.map +1 -0
  237. package/dist/skill-memory/curator-lock.js +205 -0
  238. package/dist/skill-memory/curator-lock.js.map +1 -0
  239. package/dist/skill-memory/curator-pass2.d.ts +81 -0
  240. package/dist/skill-memory/curator-pass2.d.ts.map +1 -0
  241. package/dist/skill-memory/curator-pass2.js +256 -0
  242. package/dist/skill-memory/curator-pass2.js.map +1 -0
  243. package/dist/skill-memory/curator.d.ts +88 -0
  244. package/dist/skill-memory/curator.d.ts.map +1 -0
  245. package/dist/skill-memory/curator.js +253 -0
  246. package/dist/skill-memory/curator.js.map +1 -0
  247. package/dist/skill-memory/extractor.d.ts +76 -0
  248. package/dist/skill-memory/extractor.d.ts.map +1 -0
  249. package/dist/skill-memory/extractor.js +257 -0
  250. package/dist/skill-memory/extractor.js.map +1 -0
  251. package/dist/skill-memory/index.d.ts +26 -0
  252. package/dist/skill-memory/index.d.ts.map +1 -0
  253. package/dist/skill-memory/index.js +49 -0
  254. package/dist/skill-memory/index.js.map +1 -0
  255. package/dist/skill-memory/llm-merge.d.ts +68 -0
  256. package/dist/skill-memory/llm-merge.d.ts.map +1 -0
  257. package/dist/skill-memory/llm-merge.js +170 -0
  258. package/dist/skill-memory/llm-merge.js.map +1 -0
  259. package/dist/skill-memory/recall.d.ts +88 -0
  260. package/dist/skill-memory/recall.d.ts.map +1 -0
  261. package/dist/skill-memory/recall.js +182 -0
  262. package/dist/skill-memory/recall.js.map +1 -0
  263. package/dist/skill-memory/skill-md.d.ts +26 -0
  264. package/dist/skill-memory/skill-md.d.ts.map +1 -0
  265. package/dist/skill-memory/skill-md.js +227 -0
  266. package/dist/skill-memory/skill-md.js.map +1 -0
  267. package/dist/skill-memory/stop-words.d.ts +10 -0
  268. package/dist/skill-memory/stop-words.d.ts.map +1 -0
  269. package/dist/skill-memory/stop-words.js +41 -0
  270. package/dist/skill-memory/stop-words.js.map +1 -0
  271. package/dist/skill-memory/types.d.ts +71 -0
  272. package/dist/skill-memory/types.d.ts.map +1 -0
  273. package/dist/skill-memory/types.js +19 -0
  274. package/dist/skill-memory/types.js.map +1 -0
  275. package/dist/tools/act.js +1 -1
  276. package/dist/tools/act.js.map +1 -1
  277. package/dist/tools/computer.d.ts.map +1 -1
  278. package/dist/tools/computer.js +58 -12
  279. package/dist/tools/computer.js.map +1 -1
  280. package/dist/tools/file-upload.d.ts +46 -0
  281. package/dist/tools/file-upload.d.ts.map +1 -1
  282. package/dist/tools/file-upload.js +157 -42
  283. package/dist/tools/file-upload.js.map +1 -1
  284. package/dist/tools/fill-form.d.ts.map +1 -1
  285. package/dist/tools/fill-form.js +122 -4
  286. package/dist/tools/fill-form.js.map +1 -1
  287. package/dist/tools/find.js.map +1 -1
  288. package/dist/tools/index.d.ts.map +1 -1
  289. package/dist/tools/index.js +6 -0
  290. package/dist/tools/index.js.map +1 -1
  291. package/dist/tools/inspect.js +4 -4
  292. package/dist/tools/inspect.js.map +1 -1
  293. package/dist/tools/login-detector.d.ts +87 -0
  294. package/dist/tools/login-detector.d.ts.map +1 -0
  295. package/dist/tools/login-detector.js +169 -0
  296. package/dist/tools/login-detector.js.map +1 -0
  297. package/dist/tools/navigate.d.ts.map +1 -1
  298. package/dist/tools/navigate.js +137 -52
  299. package/dist/tools/navigate.js.map +1 -1
  300. package/dist/tools/orchestration.d.ts.map +1 -1
  301. package/dist/tools/orchestration.js +1 -1
  302. package/dist/tools/orchestration.js.map +1 -1
  303. package/dist/tools/page-reload.d.ts.map +1 -1
  304. package/dist/tools/page-reload.js +0 -1
  305. package/dist/tools/page-reload.js.map +1 -1
  306. package/dist/tools/page-screenshot.d.ts.map +1 -1
  307. package/dist/tools/page-screenshot.js +32 -28
  308. package/dist/tools/page-screenshot.js.map +1 -1
  309. package/dist/tools/query-dom.d.ts.map +1 -1
  310. package/dist/tools/query-dom.js.map +1 -1
  311. package/dist/tools/read-page.d.ts.map +1 -1
  312. package/dist/tools/read-page.js +44 -7
  313. package/dist/tools/read-page.js.map +1 -1
  314. package/dist/tools/reap-orphans.d.ts +3 -0
  315. package/dist/tools/reap-orphans.d.ts.map +1 -0
  316. package/dist/tools/reap-orphans.js +62 -0
  317. package/dist/tools/reap-orphans.js.map +1 -0
  318. package/dist/tools/recording.d.ts.map +1 -1
  319. package/dist/tools/recording.js.map +1 -1
  320. package/dist/tools/validate-page.d.ts +16 -0
  321. package/dist/tools/validate-page.d.ts.map +1 -0
  322. package/dist/tools/validate-page.js +309 -0
  323. package/dist/tools/validate-page.js.map +1 -0
  324. package/dist/tools/wait-for.js +2 -2
  325. package/dist/tools/wait-for.js.map +1 -1
  326. package/dist/trace/cdp-attach.d.ts +51 -0
  327. package/dist/trace/cdp-attach.d.ts.map +1 -0
  328. package/dist/trace/cdp-attach.js +68 -0
  329. package/dist/trace/cdp-attach.js.map +1 -0
  330. package/dist/trace/index.d.ts +14 -0
  331. package/dist/trace/index.d.ts.map +1 -0
  332. package/dist/trace/index.js +24 -0
  333. package/dist/trace/index.js.map +1 -0
  334. package/dist/trace/recorder.d.ts +102 -0
  335. package/dist/trace/recorder.d.ts.map +1 -0
  336. package/dist/trace/recorder.js +247 -0
  337. package/dist/trace/recorder.js.map +1 -0
  338. package/dist/trace/redactor.d.ts +37 -0
  339. package/dist/trace/redactor.d.ts.map +1 -0
  340. package/dist/trace/redactor.js +195 -0
  341. package/dist/trace/redactor.js.map +1 -0
  342. package/dist/trace/storage.d.ts +70 -0
  343. package/dist/trace/storage.d.ts.map +1 -0
  344. package/dist/trace/storage.js +252 -0
  345. package/dist/trace/storage.js.map +1 -0
  346. package/dist/trace/types.d.ts +43 -0
  347. package/dist/trace/types.d.ts.map +1 -0
  348. package/dist/trace/types.js +9 -0
  349. package/dist/trace/types.js.map +1 -0
  350. package/dist/transports/http.d.ts +17 -0
  351. package/dist/transports/http.d.ts.map +1 -1
  352. package/dist/transports/http.js +256 -43
  353. package/dist/transports/http.js.map +1 -1
  354. package/dist/transports/index.d.ts +7 -0
  355. package/dist/transports/index.d.ts.map +1 -1
  356. package/dist/transports/index.js +5 -1
  357. package/dist/transports/index.js.map +1 -1
  358. package/dist/transports/stdio.d.ts.map +1 -1
  359. package/dist/transports/stdio.js +15 -0
  360. package/dist/transports/stdio.js.map +1 -1
  361. package/dist/types/mcp.d.ts +1 -1
  362. package/dist/types/mcp.d.ts.map +1 -1
  363. package/dist/types/mcp.js.map +1 -1
  364. package/dist/types/session.d.ts +1 -0
  365. package/dist/types/session.d.ts.map +1 -1
  366. package/dist/utils/atomic-file.js +1 -1
  367. package/dist/utils/atomic-file.js.map +1 -1
  368. package/dist/utils/crawl-utils.js +1 -1
  369. package/dist/utils/crawl-utils.js.map +1 -1
  370. package/dist/utils/pagination-detector.d.ts +1 -1
  371. package/dist/utils/pagination-detector.d.ts.map +1 -1
  372. package/dist/utils/pagination-detector.js +1 -1
  373. package/dist/utils/pagination-detector.js.map +1 -1
  374. package/dist/utils/pid-manager.d.ts +16 -0
  375. package/dist/utils/pid-manager.d.ts.map +1 -1
  376. package/dist/utils/pid-manager.js +88 -0
  377. package/dist/utils/pid-manager.js.map +1 -1
  378. package/dist/utils/ralph/outcome-classifier.d.ts.map +1 -1
  379. package/dist/utils/ralph/outcome-classifier.js +0 -1
  380. package/dist/utils/ralph/outcome-classifier.js.map +1 -1
  381. package/dist/utils/ref-id-manager.js +4 -4
  382. package/dist/utils/ref-id-manager.js.map +1 -1
  383. package/dist/utils/request-queue.d.ts +1 -0
  384. package/dist/utils/request-queue.d.ts.map +1 -1
  385. package/dist/utils/request-queue.js +18 -4
  386. package/dist/utils/request-queue.js.map +1 -1
  387. package/dist/utils/screenshot-guards.d.ts +46 -0
  388. package/dist/utils/screenshot-guards.d.ts.map +1 -0
  389. package/dist/utils/screenshot-guards.js +82 -0
  390. package/dist/utils/screenshot-guards.js.map +1 -0
  391. package/dist/utils/session-resume-token.d.ts +53 -0
  392. package/dist/utils/session-resume-token.d.ts.map +1 -0
  393. package/dist/utils/session-resume-token.js +191 -0
  394. package/dist/utils/session-resume-token.js.map +1 -0
  395. package/dist/utils/sync-shutdown.d.ts +51 -0
  396. package/dist/utils/sync-shutdown.d.ts.map +1 -0
  397. package/dist/utils/sync-shutdown.js +112 -0
  398. package/dist/utils/sync-shutdown.js.map +1 -0
  399. package/dist/vision/screenshot-analyzer.d.ts.map +1 -1
  400. package/dist/vision/screenshot-analyzer.js +11 -1
  401. package/dist/vision/screenshot-analyzer.js.map +1 -1
  402. package/dist/watchdog/health-endpoint.d.ts +5 -0
  403. package/dist/watchdog/health-endpoint.d.ts.map +1 -1
  404. package/dist/watchdog/health-endpoint.js +14 -2
  405. package/dist/watchdog/health-endpoint.js.map +1 -1
  406. package/package.json +3 -2
package/README.md CHANGED
@@ -14,6 +14,7 @@
14
14
  <a href="https://github.com/shaun0927/openchrome/releases/latest"><img src="https://img.shields.io/github/v/release/shaun0927/openchrome" alt="Latest Release"></a>
15
15
  <a href="https://github.com/shaun0927/openchrome/releases/latest"><img src="https://img.shields.io/github/release-date/shaun0927/openchrome" alt="Release Date"></a>
16
16
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT"></a>
17
+ <a href="https://mseep.ai/app/shaun0927-openchrome"><img src="assets/badges/mseep.png" alt="Listed on MseeP.ai" height="20"></a>
17
18
  </p>
18
19
 
19
20
  <p align="center">
@@ -208,6 +209,11 @@ npx openchrome-mcp setup
208
209
  npx openchrome-mcp setup --client codex
209
210
  ```
210
211
 
212
+ **OpenCode**
213
+ ```bash
214
+ npx openchrome-mcp setup --client opencode
215
+ ```
216
+
211
217
  One command. Configures the MCP server for the selected client.
212
218
  Restart your MCP client after setup completes.
213
219
 
@@ -244,6 +250,20 @@ claude mcp add openchrome -- npx -y openchrome-mcp@latest serve --auto-launch
244
250
  }
245
251
  ```
246
252
 
253
+
254
+ **OpenCode** (`~/.config/opencode/opencode.json`):
255
+ ```json
256
+ {
257
+ "$schema": "https://opencode.ai/config.json",
258
+ "mcp": {
259
+ "openchrome": {
260
+ "type": "local",
261
+ "command": ["npx", "--prefer-online", "-y", "openchrome-mcp@latest", "serve", "--auto-launch"]
262
+ }
263
+ }
264
+ }
265
+ ```
266
+
247
267
  **Cursor / Windsurf / Other stdio MCP clients:**
248
268
  ```json
249
269
  {
@@ -397,9 +417,11 @@ When a navigation is blocked by CDN/WAF systems (Akamai, Cloudflare, etc.), Open
397
417
  Tier 3 launches a real headed Chrome window with a genuine user-agent (`Chrome/...` instead of `HeadlessChrome/...`) and a different TLS fingerprint, bypassing binary-level detection that no JavaScript injection can fix.
398
418
 
399
419
  **Parameters:**
400
- - `autoFallback: false` — disable all automatic retry
401
- - `headed: true` — skip directly to Tier 3 (headed Chrome)
402
- - `stealth: true` — use stealth mode (Tier 2) explicitly
420
+ - `autoFallback: false` — disable automatic CDN/WAF retry. This does not log in for you or bypass normal authentication redirects.
421
+ - `headed: true` — skip directly to headed Chrome for user-visible login, 2FA, CAPTCHA, or sites that require a real browser window.
422
+ - `stealth: true` — use stealth mode (Tier 2) explicitly.
423
+
424
+ **Authentication note:** Auto-fallback is for detected CDN/WAF blocking. If a protected app redirects from the requested URL to a same-site login page, treat that as an authentication handoff: retry with `headed: true` and the same persistent profile, let the user complete login, then verify whether headless can reuse that profile state.
403
425
 
404
426
  **Environment:** Tier 3 requires a display (macOS/Windows desktop, or Linux with `$DISPLAY`). In server/container environments without a display, Tier 3 is gracefully skipped.
405
427
 
@@ -426,15 +448,22 @@ If client A opens five tabs and client B opens five tabs, all ten `tabId`s are d
426
448
 
427
449
  ### How do I handle sites that require interactive login (password, 2FA, CAPTCHA)?
428
450
 
429
- Two mechanisms, used together in practice:
451
+ Use two mechanisms, but keep their guarantees separate:
430
452
 
431
- **1. Persistent-profile headless — log in once, automate forever.**
432
- Point OpenChrome at a persistent `userDataDir` (+ optional `profileDirectory`) and cookies / `localStorage` / IndexedDB survive across runs. After the first login, subsequent **headless** runs stay logged in until the site invalidates the session.
453
+ **1. Persistent-profile headless — reuse an already-authenticated profile.**
454
+ Point OpenChrome at a persistent `userDataDir` (+ optional `profileDirectory`) so cookies / `localStorage` / IndexedDB can survive across runs. If that persistent profile already contains a valid session, subsequent **headless** runs stay logged in until the site invalidates the session.
433
455
 
434
- **2. Headed fallback for the initial login or WAF-blocked sites.**
435
- When a human action is genuinely required (first-time login, 2FA, CAPTCHA, WebAuthn) or when a Tier-1/Tier-2 headless attempt is blocked by a CDN/WAF, OpenChrome lazy-launches a separate headed Chrome on a different debug port. Cookies are sync'd from the real Chrome profile before launch, and the headed page is registered back into the same logical session so the surrounding workflow continues seamlessly.
456
+ **2. Headed-by-default / headed fallback let the user complete an interactive step.**
457
+ Since #657 the launcher runs headed by default, so first-time login, 2FA, CAPTCHA, and WebAuthn can use a real visible window without extra flags. CI / Docker users opt into headless via `--headless` or `OPENCHROME_HEADLESS=1` after their persistent profile is bootstrapped. When a Tier-1/Tier-2 headless attempt is blocked by a CDN/WAF, OpenChrome can also lazy-launch a separate headed Chrome on a different debug port and register the headed page back into the same logical session.
436
458
 
437
- **Typical pattern:** bootstrap the login once via the headed path the persistent profile carries the cookies all subsequent automation runs headless without a window.
459
+ **Important:** a headed tab being authenticated does not automatically prove that a new headless tab can reuse the session after the headed tab is closed. Sites differ in how they bind cookies, storage, browser fingerprints, and session freshness. Always verify the handoff by closing/restarting the headed path you plan to stop using and navigating headless to the protected URL with the same persistent profile.
460
+
461
+ **Recommended flow:**
462
+ 1. Start with the persistent `userDataDir` / `profileDirectory` you intend to keep using.
463
+ 2. Navigate to the protected URL. If it resolves to `/login` or another auth page, do not keep retrying unauthenticated headless navigation.
464
+ 3. Use the visible headed window (default) or navigate with `headed: true` and the same profile context, then let the user complete login/2FA/CAPTCHA.
465
+ 4. Retry the protected URL with the same profile in the mode you intend to automate.
466
+ 5. If headless still lands on the login page, keep the headed tab open for that site or reconfigure persistence; do not assume the headed auth state transferred.
438
467
 
439
468
  ### Does OpenChrome steal focus with popup windows?
440
469
 
@@ -442,12 +471,12 @@ When a human action is genuinely required (first-time login, 2FA, CAPTCHA, WebAu
442
471
 
443
472
  The headed-browser focus-stealing pattern that users encounter with some MCP servers (cross-Space jumps on macOS, un-minimizable popups, per-tool-call window raises) comes from designs where the MCP drives a user-visible browser and creates OS windows as it works. OpenChrome is architected differently:
444
473
 
445
- - **Default mode is headless** — no window exists, so there is nothing to take focus.
446
474
  - **`tabs_create` opens a tab, not an OS window.** New tabs are created via CDP inside the already-running Chrome, and OpenChrome never calls `page.bringToFront()` anywhere in the codebase.
447
- - **The headed fallback is lazy and reused.** When it is needed, it launches **once** per server lifetime; every later navigation/tab runs inside that same instance. At worst you see one focus grab the very first time the fallback activates not one per action, never one per tab.
448
- - **The headed fallback is optional.** If persistent-profile headless is sufficient for your sites, you will never see a browser window.
475
+ - **No per-call window raises.** Each navigation/click/tool call runs against the existing window without `bringToFront()`, `focus()`, or any other stealing primitive. After the initial Chrome launch you keep working in your other apps without interruption.
476
+ - **One Chrome per server lifetime.** Auto-launch creates Chrome **once** at startup and reuses it for every later tool call no popup-per-action loop.
477
+ - **Headless opt-in available.** For CI/server use, `--headless` or `OPENCHROME_HEADLESS=1` runs without any window at all. The default is headed since #657 because headless mode is materially more prone to silent hangs and login failures on real-world sites.
449
478
 
450
- The only scenario in which a window appears at all is the first time the Tier-3 headed fallback activates in a given session.
479
+ The only scenario in which a focus grab can happen is the very first Chrome launch not one per tool call, never one per tab.
451
480
 
452
481
  ---
453
482
 
@@ -538,6 +567,11 @@ docker run openchrome
538
567
  | `OPENCHROME_PPID_WATCH` | Set to `0` to disable the parent-process watcher in stdio mode. Default: enabled. The watcher exits the server when its launching MCP-client parent dies, so abrupt parent termination (force-quit, `kill -9`, tmux teardown) does not orphan the openchrome process. HTTP and `both` transport modes ignore this flag — they remain daemon-capable. |
539
568
  | `OPENCHROME_PPID_WATCH_INTERVAL_MS` | Polling interval for the parent watcher in milliseconds. Default: `2000`. Clamped to `[500, 60000]`. |
540
569
  | `OPENCHROME_HEALTH_ENDPOINT` | Force-enable (`1`/`true`) or force-disable (`0`/`false`) the `/health` and `/metrics` HTTP listener. Default: on for `--transport http` / `both`, off for `--transport stdio`. Stdio-mode instances usually talk to a single MCP client over the pipe and do not need an external monitoring port; disabling it saves ~200-300 KB heap + one file descriptor per instance. Operators who run stdio under a supervisor can opt in with `OPENCHROME_HEALTH_ENDPOINT=1`; daemon-mode operators who run the health check externally can opt out with `OPENCHROME_HEALTH_ENDPOINT=0`. Invalid values (e.g. `yes`, `2`) fall through to the transport-mode default. |
570
+ | `OPENCHROME_HEADLESS` | Opt into headless Chrome from CI / Docker without `--headless`. Accepts `1`/`true`/`yes` (headless) or `0`/`false`/`no` (headed). Lower precedence than the CLI flag, higher than persisted config. Default since #657 is headed. |
571
+ | `OPENCHROME_FILE_UPLOAD_ROOTS` | Additional directories allowed for `file_upload`, separated with the platform path delimiter (`:` on POSIX, `;` on Windows). Defaults always include the server process current working directory and the temp upload directory. |
572
+ | `OPENCHROME_FILE_UPLOAD_TEMP_DIR` | Temp/upload directory allowed for `file_upload`. Default: `path.join(os.tmpdir(), 'openchrome-uploads')`. |
573
+
574
+ `file_upload` only accepts files whose resolved real path stays inside the server current working directory, the temp upload directory, or an explicit upload root. Add the narrowest possible root, for example `OPENCHROME_FILE_UPLOAD_ROOTS=/srv/openchrome/uploads`, rather than broad locations such as `$HOME`, browser profiles, SSH/GPG/cloud credential directories, or application config trees. Symlinks and `..` traversal are resolved with `realpath` before allowlist checks, so a symlink inside an allowed root that points outside the root is rejected. For untrusted clients, prefer staging files into `OPENCHROME_FILE_UPLOAD_TEMP_DIR` and upload from there.
541
575
 
542
576
  ### Individual flags
543
577
 
@@ -553,9 +587,10 @@ openchrome serve \
553
587
  | Flag | Default | Description |
554
588
  |------|---------|-------------|
555
589
  | `--auto-launch` | `false` | Auto-launch Chrome if not running |
590
+ | `--headless` | `false` | Run Chrome headless. Also: `OPENCHROME_HEADLESS=1`. Default since #657 is headed. |
556
591
  | `--headless-shell` | `false` | Use chrome-headless-shell binary |
557
- | `--visible` | `false` | Show Chrome window (disables headless) |
558
- | `--server-mode` | `false` | Compound flag for server deployment |
592
+ | `--visible` | (deprecated) | No-op alias for headed; the new default is headed since #657. Will be removed in a future release. |
593
+ | `--server-mode` | `false` | Compound flag for server deployment (forces `--headless` + auto-launch) |
559
594
 
560
595
  ---
561
596
 
@@ -633,6 +668,12 @@ cd openchrome
633
668
  npm install && npm run build && npm test
634
669
  ```
635
670
 
671
+ ### Lint guardrails
672
+
673
+ Use `npm run lint -- --max-warnings=0` before submitting source changes. For
674
+ smaller PR checks, `npm run lint:changed -- --base origin/develop` lints only
675
+ changed `src/**/*.ts` files and also fails on warnings.
676
+
636
677
  ## License
637
678
 
638
679
  MIT
Binary file
@@ -108,7 +108,7 @@ function splitOnConjunctions(text) {
108
108
  // Split on "WORD, VERB" — comma followed by a verb-starting word
109
109
  // or " then VERB" / " and VERB"
110
110
  const result = [];
111
- let remaining = text;
111
+ const remaining = text;
112
112
  // Pattern: (", " | " then " | " and ") followed by a verb-starting token
113
113
  const re = /(?:,\s+|\s+then\s+|\s+and\s+)(?=[a-z\u3131-\uD7A3\u4E00-\u9FFF])/gi;
114
114
  let lastIndex = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"action-parser.js","sourceRoot":"","sources":["../../src/actions/action-parser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAsUH,4CA0CC;AA9VD,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,iFAAiF;AACjF,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEtC,mFAAmF;IACnF,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAE5C,wEAAwE;IACxE,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACrE,IAAI,uCAAuC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrE,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACzE,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACrE,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAErD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oFAAoF;AACpF,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACrC,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,uBAAuB;IACvB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErD,mEAAmE;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEnE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,+EAA+E;QAC/E,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,IAAY;IAC7C,gEAAgE;IAChE,uEAAuE;IACvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,yDAAyD;IACzD,MAAM,EAAE,GAAG,eAAe,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,sEAAsE;QACtE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,2BAA2B;QACtF,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,iEAAiE;IACjE,gCAAgC;IAChC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,yEAAyE;IACzE,MAAM,EAAE,GAAG,oEAAoE,CAAC;IAEhF,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,yCAAyC;AACzC,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,4CAA4C;IAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,uDAAuD;IACvD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC5D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,oBAAoB;IACpB,qCAAqC;IACrC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACzG,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACjF,CAAC;IAED,iBAAiB;IACjB,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC9E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,4EAA4E;IAC5E,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAC/F,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,qDAAqD;IACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,oBAAoB;IACpB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,6EAA6E;IAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAC7F,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAExB,qCAAqC;IACrC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;IACxG,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IACpG,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACrE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC7E,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,IAAgB;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,8DAA8D,EAAE,EAAE,CAAC,CAAC;IAC/F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,iEAAiE,EAAE,EAAE,CAAC,CAAC;IAClG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,iDAAiD;QACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC,CAAI,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,CAAK,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QACjD,KAAK,QAAQ,CAAC,CAAG,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,KAAK,UAAU,CAAC,CAAC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACrD,KAAK,QAAQ,CAAC,CAAG,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,CAAK,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QACjD,KAAK,OAAO,CAAC,CAAI,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,KAAK,SAAS,CAAC,CAAE,OAAO,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,KAAK,OAAO,CAAC,CAAI,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,sBAAsB;YAC7B,UAAU,EAAE,4GAA4G;SACzH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,iCAAiC,WAAW,GAAG;YACtD,UAAU,EAAE,4GAA4G;SACzH,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,uFAAuF;QACvF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,UAAU,EAAE,6CAA6C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD;SAChJ,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"action-parser.js","sourceRoot":"","sources":["../../src/actions/action-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Chrome exit classifier (#660).
3
+ *
4
+ * Distinguishes user-initiated close from a crash so the watchdog can stop
5
+ * silently re-launching Chrome that the user just told the OS to close.
6
+ *
7
+ * Inputs are the Node `exit` event fields plus how long Chrome was alive
8
+ * before the exit fired:
9
+ * - code — process exit code, or `null` if killed by a signal
10
+ * - signal — POSIX signal name, or `null` if exited normally
11
+ * - uptimeMs — wall time from spawn to exit
12
+ * - intentionalStop — set by the launcher when oc_stop / shutdown ran
13
+ *
14
+ * Anti-flap: Chrome cold-start typically takes 1-3 s. A "clean" exit within
15
+ * a few seconds overwhelmingly indicates a misconfigured launch (bad
16
+ * --user-data-dir, missing binary) rather than a deliberate user action.
17
+ * The threshold defaults to 5 s and is configurable via
18
+ * OPENCHROME_ANTIFLAP_SECONDS.
19
+ */
20
+ export type ExitClassification = 'intentional' | 'clean' | 'crash';
21
+ export interface ClassifyExitInput {
22
+ /** Process exit code (number) or null if killed by a signal. */
23
+ code: number | null;
24
+ /** Signal name (e.g. 'SIGTERM') or null. */
25
+ signal: NodeJS.Signals | null;
26
+ /** Milliseconds Chrome was alive before exit. */
27
+ uptimeMs: number;
28
+ /** True if openchrome itself initiated the stop (oc_stop or MCP shutdown). */
29
+ intentionalStop: boolean;
30
+ }
31
+ /**
32
+ * Read the anti-flap threshold (in milliseconds) from
33
+ * OPENCHROME_ANTIFLAP_SECONDS, with a 5-second default.
34
+ *
35
+ * `0` means "disable anti-flap entirely" (gemini medium review on #668).
36
+ * Negative / non-numeric values fall back to the default. Callers can
37
+ * pass an override for tests.
38
+ */
39
+ export declare function antiFlapMs(envValue?: string | undefined): number;
40
+ /**
41
+ * Read the watchdog quiesce duration (ms) from OPENCHROME_QUIESCE_MS.
42
+ * Default is 60 s. `0` disables quiesce entirely (gemini high review on #668).
43
+ */
44
+ export declare function quiesceMs(envValue?: string | undefined): number;
45
+ /**
46
+ * Classify a Chrome exit.
47
+ *
48
+ * Decision matrix (highest priority first):
49
+ * 1. intentionalStop=true → 'intentional'
50
+ * 2. uptimeMs < anti-flap → 'crash' (Chrome failed to start cleanly)
51
+ * 3. code===0 → 'clean' (user closed window normally)
52
+ * 4. SIGTERM / SIGINT → 'clean' (red dot / Cmd+Q / WM close)
53
+ * 5. otherwise → 'crash' (segfault, OOM, abort, …)
54
+ */
55
+ export declare function classifyExit(input: ClassifyExitInput, opts?: {
56
+ antiFlapMs?: number;
57
+ }): ExitClassification;
58
+ /**
59
+ * Should the watchdog rate-limit relaunches because Chrome has been
60
+ * crashing repeatedly? Returns true after `threshold` crashes inside
61
+ * `windowMs`.
62
+ *
63
+ * Pure function: caller provides the timestamps array.
64
+ */
65
+ export declare function shouldRateLimitRelaunch(recentCrashTimestampsMs: ReadonlyArray<number>, now?: number, windowMs?: number, threshold?: number): boolean;
66
+ //# sourceMappingURL=exit-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-classifier.d.ts","sourceRoot":"","sources":["../../src/chrome/exit-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,GAAE,MAAM,GAAG,SAAmD,GAAG,MAAM,CAKzG;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,GAAE,MAAM,GAAG,SAA6C,GAAG,MAAM,CAKlG;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,kBAAkB,CAiBpB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,uBAAuB,EAAE,aAAa,CAAC,MAAM,CAAC,EAC9C,GAAG,GAAE,MAAmB,EACxB,QAAQ,GAAE,MAAe,EACzB,SAAS,GAAE,MAAU,GACpB,OAAO,CAMT"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Chrome exit classifier (#660).
4
+ *
5
+ * Distinguishes user-initiated close from a crash so the watchdog can stop
6
+ * silently re-launching Chrome that the user just told the OS to close.
7
+ *
8
+ * Inputs are the Node `exit` event fields plus how long Chrome was alive
9
+ * before the exit fired:
10
+ * - code — process exit code, or `null` if killed by a signal
11
+ * - signal — POSIX signal name, or `null` if exited normally
12
+ * - uptimeMs — wall time from spawn to exit
13
+ * - intentionalStop — set by the launcher when oc_stop / shutdown ran
14
+ *
15
+ * Anti-flap: Chrome cold-start typically takes 1-3 s. A "clean" exit within
16
+ * a few seconds overwhelmingly indicates a misconfigured launch (bad
17
+ * --user-data-dir, missing binary) rather than a deliberate user action.
18
+ * The threshold defaults to 5 s and is configurable via
19
+ * OPENCHROME_ANTIFLAP_SECONDS.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.antiFlapMs = antiFlapMs;
23
+ exports.quiesceMs = quiesceMs;
24
+ exports.classifyExit = classifyExit;
25
+ exports.shouldRateLimitRelaunch = shouldRateLimitRelaunch;
26
+ /**
27
+ * Read the anti-flap threshold (in milliseconds) from
28
+ * OPENCHROME_ANTIFLAP_SECONDS, with a 5-second default.
29
+ *
30
+ * `0` means "disable anti-flap entirely" (gemini medium review on #668).
31
+ * Negative / non-numeric values fall back to the default. Callers can
32
+ * pass an override for tests.
33
+ */
34
+ function antiFlapMs(envValue = process.env.OPENCHROME_ANTIFLAP_SECONDS) {
35
+ if (envValue === undefined || envValue === '')
36
+ return 5_000;
37
+ const parsed = parseInt(envValue, 10);
38
+ if (!Number.isFinite(parsed) || parsed < 0)
39
+ return 5_000;
40
+ return parsed * 1000;
41
+ }
42
+ /**
43
+ * Read the watchdog quiesce duration (ms) from OPENCHROME_QUIESCE_MS.
44
+ * Default is 60 s. `0` disables quiesce entirely (gemini high review on #668).
45
+ */
46
+ function quiesceMs(envValue = process.env.OPENCHROME_QUIESCE_MS) {
47
+ if (envValue === undefined || envValue === '')
48
+ return 60_000;
49
+ const parsed = parseInt(envValue, 10);
50
+ if (!Number.isFinite(parsed) || parsed < 0)
51
+ return 60_000;
52
+ return parsed;
53
+ }
54
+ /**
55
+ * Classify a Chrome exit.
56
+ *
57
+ * Decision matrix (highest priority first):
58
+ * 1. intentionalStop=true → 'intentional'
59
+ * 2. uptimeMs < anti-flap → 'crash' (Chrome failed to start cleanly)
60
+ * 3. code===0 → 'clean' (user closed window normally)
61
+ * 4. SIGTERM / SIGINT → 'clean' (red dot / Cmd+Q / WM close)
62
+ * 5. otherwise → 'crash' (segfault, OOM, abort, …)
63
+ */
64
+ function classifyExit(input, opts = {}) {
65
+ if (input.intentionalStop)
66
+ return 'intentional';
67
+ const flapMs = opts.antiFlapMs ?? antiFlapMs();
68
+ // Negative uptime can't physically happen but we still treat it as "no
69
+ // uptime info" rather than auto-crashing on clock-skew weirdness.
70
+ if (input.uptimeMs < flapMs)
71
+ return 'crash';
72
+ if (input.code === 0)
73
+ return 'clean';
74
+ // Signal-based clean exits (POSIX user close → SIGTERM, Ctrl+C → SIGINT).
75
+ // Node guarantees at least one of (code, signal) is non-null on the
76
+ // 'exit' event, so we don't re-handle the all-null case here.
77
+ const cleanSignals = ['SIGTERM', 'SIGINT'];
78
+ if (input.signal !== null && cleanSignals.includes(input.signal))
79
+ return 'clean';
80
+ return 'crash';
81
+ }
82
+ /**
83
+ * Should the watchdog rate-limit relaunches because Chrome has been
84
+ * crashing repeatedly? Returns true after `threshold` crashes inside
85
+ * `windowMs`.
86
+ *
87
+ * Pure function: caller provides the timestamps array.
88
+ */
89
+ function shouldRateLimitRelaunch(recentCrashTimestampsMs, now = Date.now(), windowMs = 60_000, threshold = 3) {
90
+ let count = 0;
91
+ for (const t of recentCrashTimestampsMs) {
92
+ if (now - t <= windowMs)
93
+ count++;
94
+ }
95
+ return count >= threshold;
96
+ }
97
+ //# sourceMappingURL=exit-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-classifier.js","sourceRoot":"","sources":["../../src/chrome/exit-classifier.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AAuBH,gCAKC;AAMD,8BAKC;AAYD,oCAoBC;AASD,0DAWC;AA5ED;;;;;;;GAOG;AACH,SAAgB,UAAU,CAAC,WAA+B,OAAO,CAAC,GAAG,CAAC,2BAA2B;IAC/F,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,WAA+B,OAAO,CAAC,GAAG,CAAC,qBAAqB;IACxF,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,KAAwB,EACxB,OAAgC,EAAE;IAElC,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,aAAa,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;IAC/C,uEAAuE;IACvE,kEAAkE;IAClE,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM;QAAE,OAAO,OAAO,CAAC;IAE5C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAErC,0EAA0E;IAC1E,oEAAoE;IACpE,8DAA8D;IAC9D,MAAM,YAAY,GAAkC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CACrC,uBAA8C,EAC9C,MAAc,IAAI,CAAC,GAAG,EAAE,EACxB,WAAmB,MAAM,EACzB,YAAoB,CAAC;IAErB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,uBAAuB,EAAE,CAAC;QACxC,IAAI,GAAG,GAAG,CAAC,IAAI,QAAQ;YAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Launch mode resolver (#659).
3
+ *
4
+ * Decides how openchrome should obtain a Chrome to drive when the user
5
+ * specifies a profile.
6
+ *
7
+ * Three modes:
8
+ *
9
+ * 'auto' — default; openchrome probes the configured remote-debugging
10
+ * port first and attaches if Chrome is already there;
11
+ * otherwise spawns its own Chrome. (Existing behavior — no
12
+ * change for users who don't set anything.)
13
+ *
14
+ * 'attach' — opt-in; openchrome MUST attach to an existing Chrome that
15
+ * the user pre-launched with `--remote-debugging-port`. If
16
+ * nothing is listening, the launcher returns a structured
17
+ * error (`AttachConsentRequiredError`) so the agent can
18
+ * surface a helpful next-step message instead of silently
19
+ * spawning a clean-room copy.
20
+ *
21
+ * 'isolated' — opt-in; openchrome ALWAYS spawns its own Chrome with the
22
+ * isolated `--user-data-dir` even if a Chrome is already
23
+ * listening on the debug port. Useful for clean-room
24
+ * scraping where you want a guaranteed fresh profile.
25
+ *
26
+ * Important policy decisions baked in here (see #659 PR description):
27
+ * 1. Default stays 'auto'. No behavior change for existing users.
28
+ * 2. We NEVER auto-restart the user's Chrome to enable a debug port.
29
+ * If the user wants attach mode, they must launch Chrome themselves
30
+ * with `--remote-debugging-port=NNNN`. The follow-up "automatic
31
+ * restart with consent" workflow is deferred to a separate issue.
32
+ * 3. When attach mode is on AND the port isn't listening, we surface a
33
+ * loud, structured error rather than silently falling back —
34
+ * otherwise the user would never realise their attach attempt
35
+ * didn't take.
36
+ */
37
+ export type LaunchMode = 'auto' | 'attach' | 'isolated';
38
+ export interface LaunchModeOptions {
39
+ /** Per-call override (highest priority). */
40
+ launchMode?: LaunchMode | string;
41
+ }
42
+ export interface LaunchModeEnv {
43
+ OPENCHROME_LAUNCH_MODE?: string;
44
+ }
45
+ export interface LaunchModeConfig {
46
+ chromeLaunchMode?: LaunchMode | string;
47
+ }
48
+ export declare class InvalidLaunchModeError extends Error {
49
+ constructor(value: string, source: 'cli' | 'env' | 'config');
50
+ }
51
+ /**
52
+ * Resolves the launch mode from CLI options, env, and config.
53
+ * Precedence (highest first):
54
+ * 1. options.launchMode (per-call override)
55
+ * 2. OPENCHROME_LAUNCH_MODE env var
56
+ * 3. globalConfig.chromeLaunchMode
57
+ * 4. 'auto' (default)
58
+ *
59
+ * Throws `InvalidLaunchModeError` for unrecognised values rather than
60
+ * silently coercing — surfaces typos in env vars and config files.
61
+ */
62
+ export declare function resolveLaunchMode(options?: LaunchModeOptions, env?: LaunchModeEnv, config?: LaunchModeConfig): LaunchMode;
63
+ /**
64
+ * Structured error: surface to the agent when attach is required but no
65
+ * Chrome is listening on the debug port. The agent's logs / tool output
66
+ * carry the helpful next steps so the user can react out-of-band.
67
+ *
68
+ * NOTE: openchrome runs as an MCP server over stdio with no human at the
69
+ * other end, so we cannot interactively prompt. The error message is the
70
+ * UX surface.
71
+ */
72
+ export declare class AttachConsentRequiredError extends Error {
73
+ readonly errorCode: "attach_consent_required";
74
+ readonly port: number;
75
+ readonly hint: string;
76
+ constructor(port: number);
77
+ }
78
+ //# sourceMappingURL=launch-mode-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-mode-resolver.d.ts","sourceRoot":"","sources":["../../src/chrome/launch-mode-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CACxC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ;CAI5D;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,iBAAsB,EAC/B,GAAG,GAAE,aAAkB,EACvB,MAAM,GAAE,gBAAqB,GAC5B,UAAU,CAWZ;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,SAAS,EAAG,yBAAyB,CAAU;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAYzB"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * Launch mode resolver (#659).
4
+ *
5
+ * Decides how openchrome should obtain a Chrome to drive when the user
6
+ * specifies a profile.
7
+ *
8
+ * Three modes:
9
+ *
10
+ * 'auto' — default; openchrome probes the configured remote-debugging
11
+ * port first and attaches if Chrome is already there;
12
+ * otherwise spawns its own Chrome. (Existing behavior — no
13
+ * change for users who don't set anything.)
14
+ *
15
+ * 'attach' — opt-in; openchrome MUST attach to an existing Chrome that
16
+ * the user pre-launched with `--remote-debugging-port`. If
17
+ * nothing is listening, the launcher returns a structured
18
+ * error (`AttachConsentRequiredError`) so the agent can
19
+ * surface a helpful next-step message instead of silently
20
+ * spawning a clean-room copy.
21
+ *
22
+ * 'isolated' — opt-in; openchrome ALWAYS spawns its own Chrome with the
23
+ * isolated `--user-data-dir` even if a Chrome is already
24
+ * listening on the debug port. Useful for clean-room
25
+ * scraping where you want a guaranteed fresh profile.
26
+ *
27
+ * Important policy decisions baked in here (see #659 PR description):
28
+ * 1. Default stays 'auto'. No behavior change for existing users.
29
+ * 2. We NEVER auto-restart the user's Chrome to enable a debug port.
30
+ * If the user wants attach mode, they must launch Chrome themselves
31
+ * with `--remote-debugging-port=NNNN`. The follow-up "automatic
32
+ * restart with consent" workflow is deferred to a separate issue.
33
+ * 3. When attach mode is on AND the port isn't listening, we surface a
34
+ * loud, structured error rather than silently falling back —
35
+ * otherwise the user would never realise their attach attempt
36
+ * didn't take.
37
+ */
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.AttachConsentRequiredError = exports.InvalidLaunchModeError = void 0;
40
+ exports.resolveLaunchMode = resolveLaunchMode;
41
+ class InvalidLaunchModeError extends Error {
42
+ constructor(value, source) {
43
+ super(`Invalid launch mode "${value}" (from ${source}); expected 'auto' | 'attach' | 'isolated'.`);
44
+ this.name = 'InvalidLaunchModeError';
45
+ }
46
+ }
47
+ exports.InvalidLaunchModeError = InvalidLaunchModeError;
48
+ const VALID = new Set(['auto', 'attach', 'isolated']);
49
+ function parse(value, source) {
50
+ if (value === undefined)
51
+ return undefined;
52
+ const trimmed = value.trim();
53
+ if (trimmed === '')
54
+ return undefined;
55
+ const normalized = trimmed.toLowerCase();
56
+ if (!VALID.has(normalized)) {
57
+ throw new InvalidLaunchModeError(trimmed, source);
58
+ }
59
+ return normalized;
60
+ }
61
+ /**
62
+ * Resolves the launch mode from CLI options, env, and config.
63
+ * Precedence (highest first):
64
+ * 1. options.launchMode (per-call override)
65
+ * 2. OPENCHROME_LAUNCH_MODE env var
66
+ * 3. globalConfig.chromeLaunchMode
67
+ * 4. 'auto' (default)
68
+ *
69
+ * Throws `InvalidLaunchModeError` for unrecognised values rather than
70
+ * silently coercing — surfaces typos in env vars and config files.
71
+ */
72
+ function resolveLaunchMode(options = {}, env = {}, config = {}) {
73
+ const fromCli = parse(typeof options.launchMode === 'string' ? options.launchMode : undefined, 'cli');
74
+ if (fromCli)
75
+ return fromCli;
76
+ const fromEnv = parse(env.OPENCHROME_LAUNCH_MODE, 'env');
77
+ if (fromEnv)
78
+ return fromEnv;
79
+ const fromConfig = parse(typeof config.chromeLaunchMode === 'string' ? config.chromeLaunchMode : undefined, 'config');
80
+ if (fromConfig)
81
+ return fromConfig;
82
+ return 'auto';
83
+ }
84
+ /**
85
+ * Structured error: surface to the agent when attach is required but no
86
+ * Chrome is listening on the debug port. The agent's logs / tool output
87
+ * carry the helpful next steps so the user can react out-of-band.
88
+ *
89
+ * NOTE: openchrome runs as an MCP server over stdio with no human at the
90
+ * other end, so we cannot interactively prompt. The error message is the
91
+ * UX surface.
92
+ */
93
+ class AttachConsentRequiredError extends Error {
94
+ errorCode = 'attach_consent_required';
95
+ port;
96
+ hint;
97
+ constructor(port) {
98
+ const hint = `Set OPENCHROME_LAUNCH_MODE=auto (default) to spawn a fresh Chrome instead, ` +
99
+ `OR launch Chrome yourself with --remote-debugging-port=${port} so openchrome can attach to it. ` +
100
+ `openchrome will NOT close or restart your existing Chrome automatically.`;
101
+ super(`attach mode is enabled but no Chrome is listening on debug port ${port}. ${hint}`);
102
+ this.name = 'AttachConsentRequiredError';
103
+ this.port = port;
104
+ this.hint = hint;
105
+ }
106
+ }
107
+ exports.AttachConsentRequiredError = AttachConsentRequiredError;
108
+ //# sourceMappingURL=launch-mode-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-mode-resolver.js","sourceRoot":"","sources":["../../src/chrome/launch-mode-resolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;;;AAgDH,8CAeC;AA9CD,MAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,KAAa,EAAE,MAAgC;QACzD,KAAK,CAAC,wBAAwB,KAAK,WAAW,MAAM,6CAA6C,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAED,MAAM,KAAK,GAA4B,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/E,SAAS,KAAK,CAAC,KAAyB,EAAE,MAAgC;IACxE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAwB,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAwB,CAAC;AAClC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAC/B,UAA6B,EAAE,EAC/B,MAAqB,EAAE,EACvB,SAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtG,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACtH,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAa,0BAA2B,SAAQ,KAAK;IAC1C,SAAS,GAAG,yBAAkC,CAAC;IAC/C,IAAI,CAAS;IACb,IAAI,CAAS;IAEtB,YAAY,IAAY;QACtB,MAAM,IAAI,GACR,6EAA6E;YAC7E,0DAA0D,IAAI,mCAAmC;YACjG,0EAA0E,CAAC;QAC7E,KAAK,CACH,mEAAmE,IAAI,KAAK,IAAI,EAAE,CACnF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAjBD,gEAiBC"}