openchrome-mcp 1.12.4 → 1.12.7

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 (339) hide show
  1. package/README.ko.md +14 -7
  2. package/README.md +70 -9
  3. package/dist/broker/discovery.d.ts +27 -0
  4. package/dist/broker/discovery.d.ts.map +1 -0
  5. package/dist/broker/discovery.js +98 -0
  6. package/dist/broker/discovery.js.map +1 -0
  7. package/dist/broker/lifecycle.d.ts +19 -0
  8. package/dist/broker/lifecycle.d.ts.map +1 -0
  9. package/dist/broker/lifecycle.js +74 -0
  10. package/dist/broker/lifecycle.js.map +1 -0
  11. package/dist/cdp/client.d.ts +1 -0
  12. package/dist/cdp/client.d.ts.map +1 -1
  13. package/dist/cdp/client.js +45 -9
  14. package/dist/cdp/client.js.map +1 -1
  15. package/dist/cli/doctor/checks/duplicate-controllers.d.ts +7 -0
  16. package/dist/cli/doctor/checks/duplicate-controllers.d.ts.map +1 -0
  17. package/dist/cli/doctor/checks/duplicate-controllers.js +30 -0
  18. package/dist/cli/doctor/checks/duplicate-controllers.js.map +1 -0
  19. package/dist/cli/doctor.d.ts.map +1 -1
  20. package/dist/cli/doctor.js +2 -0
  21. package/dist/cli/doctor.js.map +1 -1
  22. package/dist/cli/index.js +48 -17
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/mcp-client-config.d.ts +10 -0
  25. package/dist/cli/mcp-client-config.js +61 -3
  26. package/dist/cli/mcp-client-config.js.map +1 -1
  27. package/dist/cli/update-command.d.ts +6 -1
  28. package/dist/cli/update-command.js +12 -0
  29. package/dist/cli/update-command.js.map +1 -1
  30. package/dist/contracts/eval-context.d.ts +17 -0
  31. package/dist/contracts/eval-context.d.ts.map +1 -1
  32. package/dist/contracts/evaluate.d.ts.map +1 -1
  33. package/dist/contracts/evaluate.js +3 -0
  34. package/dist/contracts/evaluate.js.map +1 -1
  35. package/dist/contracts/evaluators/image-qa.d.ts +14 -0
  36. package/dist/contracts/evaluators/image-qa.d.ts.map +1 -0
  37. package/dist/contracts/evaluators/image-qa.js +95 -0
  38. package/dist/contracts/evaluators/image-qa.js.map +1 -0
  39. package/dist/contracts/templates/default-registry.d.ts +31 -0
  40. package/dist/contracts/templates/default-registry.d.ts.map +1 -0
  41. package/dist/contracts/templates/default-registry.js +54 -0
  42. package/dist/contracts/templates/default-registry.js.map +1 -0
  43. package/dist/contracts/templates/index.d.ts +12 -0
  44. package/dist/contracts/templates/index.d.ts.map +1 -0
  45. package/dist/contracts/templates/index.js +18 -0
  46. package/dist/contracts/templates/index.js.map +1 -0
  47. package/dist/contracts/templates/public-web/authenticated-fields.d.ts +34 -0
  48. package/dist/contracts/templates/public-web/authenticated-fields.d.ts.map +1 -0
  49. package/dist/contracts/templates/public-web/authenticated-fields.js +82 -0
  50. package/dist/contracts/templates/public-web/authenticated-fields.js.map +1 -0
  51. package/dist/contracts/templates/public-web/link-graph.d.ts +24 -0
  52. package/dist/contracts/templates/public-web/link-graph.d.ts.map +1 -0
  53. package/dist/contracts/templates/public-web/link-graph.js +64 -0
  54. package/dist/contracts/templates/public-web/link-graph.js.map +1 -0
  55. package/dist/contracts/templates/public-web/page-meta.d.ts +22 -0
  56. package/dist/contracts/templates/public-web/page-meta.d.ts.map +1 -0
  57. package/dist/contracts/templates/public-web/page-meta.js +57 -0
  58. package/dist/contracts/templates/public-web/page-meta.js.map +1 -0
  59. package/dist/contracts/templates/public-web/spa-hydrated.d.ts +31 -0
  60. package/dist/contracts/templates/public-web/spa-hydrated.d.ts.map +1 -0
  61. package/dist/contracts/templates/public-web/spa-hydrated.js +81 -0
  62. package/dist/contracts/templates/public-web/spa-hydrated.js.map +1 -0
  63. package/dist/contracts/templates/registry.d.ts +59 -0
  64. package/dist/contracts/templates/registry.d.ts.map +1 -0
  65. package/dist/contracts/templates/registry.js +157 -0
  66. package/dist/contracts/templates/registry.js.map +1 -0
  67. package/dist/contracts/templates/types.d.ts +84 -0
  68. package/dist/contracts/templates/types.d.ts.map +1 -0
  69. package/dist/contracts/templates/types.js +53 -0
  70. package/dist/contracts/templates/types.js.map +1 -0
  71. package/dist/contracts/types.d.ts +15 -1
  72. package/dist/contracts/types.d.ts.map +1 -1
  73. package/dist/contracts/validator.d.ts.map +1 -1
  74. package/dist/contracts/validator.js +15 -0
  75. package/dist/contracts/validator.js.map +1 -1
  76. package/dist/core/browser-lanes.d.ts +21 -0
  77. package/dist/core/browser-lanes.d.ts.map +1 -1
  78. package/dist/core/browser-lanes.js +94 -8
  79. package/dist/core/browser-lanes.js.map +1 -1
  80. package/dist/core/codegen/aggregator.d.ts +1 -0
  81. package/dist/core/codegen/aggregator.d.ts.map +1 -1
  82. package/dist/core/codegen/aggregator.js +24 -2
  83. package/dist/core/codegen/aggregator.js.map +1 -1
  84. package/dist/core/contracts/evidence-bundle.d.ts +44 -1
  85. package/dist/core/contracts/evidence-bundle.d.ts.map +1 -1
  86. package/dist/core/contracts/evidence-bundle.js +32 -1
  87. package/dist/core/contracts/evidence-bundle.js.map +1 -1
  88. package/dist/core/contracts/promotion-gate.d.ts +75 -0
  89. package/dist/core/contracts/promotion-gate.d.ts.map +1 -0
  90. package/dist/core/contracts/promotion-gate.js +82 -0
  91. package/dist/core/contracts/promotion-gate.js.map +1 -0
  92. package/dist/core/contracts/schema-diff.d.ts +89 -0
  93. package/dist/core/contracts/schema-diff.d.ts.map +1 -0
  94. package/dist/core/contracts/schema-diff.js +120 -0
  95. package/dist/core/contracts/schema-diff.js.map +1 -0
  96. package/dist/core/server.d.ts.map +1 -1
  97. package/dist/core/server.js +4 -0
  98. package/dist/core/server.js.map +1 -1
  99. package/dist/core/skill-memory/index.d.ts +2 -2
  100. package/dist/core/skill-memory/index.d.ts.map +1 -1
  101. package/dist/core/skill-memory/index.js +2 -1
  102. package/dist/core/skill-memory/index.js.map +1 -1
  103. package/dist/core/skill-memory/promote.d.ts +79 -0
  104. package/dist/core/skill-memory/promote.d.ts.map +1 -0
  105. package/dist/core/skill-memory/promote.js +83 -0
  106. package/dist/core/skill-memory/promote.js.map +1 -0
  107. package/dist/core/skill-memory/store.d.ts +12 -0
  108. package/dist/core/skill-memory/store.d.ts.map +1 -1
  109. package/dist/core/skill-memory/store.js +117 -12
  110. package/dist/core/skill-memory/store.js.map +1 -1
  111. package/dist/core/skill-memory/types.d.ts +104 -14
  112. package/dist/core/skill-memory/types.d.ts.map +1 -1
  113. package/dist/core/skill-memory/types.js +14 -11
  114. package/dist/core/skill-memory/types.js.map +1 -1
  115. package/dist/core/task-ledger/budget.d.ts.map +1 -1
  116. package/dist/core/task-ledger/budget.js +32 -0
  117. package/dist/core/task-ledger/budget.js.map +1 -1
  118. package/dist/core/task-ledger/early-stop.d.ts +66 -0
  119. package/dist/core/task-ledger/early-stop.d.ts.map +1 -0
  120. package/dist/core/task-ledger/early-stop.js +83 -0
  121. package/dist/core/task-ledger/early-stop.js.map +1 -0
  122. package/dist/core/task-ledger/marginal-utility.d.ts +98 -0
  123. package/dist/core/task-ledger/marginal-utility.d.ts.map +1 -0
  124. package/dist/core/task-ledger/marginal-utility.js +132 -0
  125. package/dist/core/task-ledger/marginal-utility.js.map +1 -0
  126. package/dist/core/task-ledger/types.d.ts +47 -0
  127. package/dist/core/task-ledger/types.d.ts.map +1 -1
  128. package/dist/gates/detect-other-gates.d.ts +60 -0
  129. package/dist/gates/detect-other-gates.d.ts.map +1 -0
  130. package/dist/gates/detect-other-gates.js +212 -0
  131. package/dist/gates/detect-other-gates.js.map +1 -0
  132. package/dist/harness/flags.d.ts +19 -0
  133. package/dist/harness/flags.d.ts.map +1 -1
  134. package/dist/harness/flags.js +72 -4
  135. package/dist/harness/flags.js.map +1 -1
  136. package/dist/harness/irreversible-action.d.ts.map +1 -1
  137. package/dist/harness/irreversible-action.js +7 -0
  138. package/dist/harness/irreversible-action.js.map +1 -1
  139. package/dist/index.js +124 -10
  140. package/dist/index.js.map +1 -1
  141. package/dist/mcp-server.d.ts.map +1 -1
  142. package/dist/mcp-server.js +34 -3
  143. package/dist/mcp-server.js.map +1 -1
  144. package/dist/observability/request-id.d.ts +2 -0
  145. package/dist/observability/request-id.d.ts.map +1 -1
  146. package/dist/observability/request-id.js.map +1 -1
  147. package/dist/orchestration/state-manager.d.ts +2 -0
  148. package/dist/orchestration/state-manager.d.ts.map +1 -1
  149. package/dist/orchestration/state-manager.js +56 -32
  150. package/dist/orchestration/state-manager.js.map +1 -1
  151. package/dist/pilot/auto-memory/index.d.ts +61 -0
  152. package/dist/pilot/auto-memory/index.d.ts.map +1 -0
  153. package/dist/pilot/auto-memory/index.js +149 -0
  154. package/dist/pilot/auto-memory/index.js.map +1 -0
  155. package/dist/pilot/curator/auto-extractor.d.ts +94 -0
  156. package/dist/pilot/curator/auto-extractor.d.ts.map +1 -0
  157. package/dist/pilot/curator/auto-extractor.js +160 -0
  158. package/dist/pilot/curator/auto-extractor.js.map +1 -0
  159. package/dist/pilot/curator/auto-recall.d.ts +69 -0
  160. package/dist/pilot/curator/auto-recall.d.ts.map +1 -0
  161. package/dist/pilot/curator/auto-recall.js +119 -0
  162. package/dist/pilot/curator/auto-recall.js.map +1 -0
  163. package/dist/pilot/curator/body-builder.d.ts +53 -0
  164. package/dist/pilot/curator/body-builder.d.ts.map +1 -0
  165. package/dist/pilot/curator/body-builder.js +171 -0
  166. package/dist/pilot/curator/body-builder.js.map +1 -0
  167. package/dist/pilot/curator/extractor.d.ts +13 -0
  168. package/dist/pilot/curator/extractor.d.ts.map +1 -1
  169. package/dist/pilot/curator/extractor.js +1 -0
  170. package/dist/pilot/curator/extractor.js.map +1 -1
  171. package/dist/pilot/curator/failed-run.d.ts +58 -0
  172. package/dist/pilot/curator/failed-run.d.ts.map +1 -0
  173. package/dist/pilot/curator/failed-run.js +159 -0
  174. package/dist/pilot/curator/failed-run.js.map +1 -0
  175. package/dist/pilot/curator/index.d.ts +10 -0
  176. package/dist/pilot/curator/index.d.ts.map +1 -1
  177. package/dist/pilot/curator/index.js +30 -1
  178. package/dist/pilot/curator/index.js.map +1 -1
  179. package/dist/pilot/curator/runner.d.ts +1 -1
  180. package/dist/pilot/curator/runner.d.ts.map +1 -1
  181. package/dist/pilot/curator/runner.js +1 -2
  182. package/dist/pilot/curator/runner.js.map +1 -1
  183. package/dist/pilot/curator/sidecar-stats.d.ts +36 -0
  184. package/dist/pilot/curator/sidecar-stats.d.ts.map +1 -0
  185. package/dist/pilot/curator/sidecar-stats.js +66 -0
  186. package/dist/pilot/curator/sidecar-stats.js.map +1 -0
  187. package/dist/pilot/index.d.ts +31 -0
  188. package/dist/pilot/index.d.ts.map +1 -1
  189. package/dist/pilot/index.js +87 -0
  190. package/dist/pilot/index.js.map +1 -1
  191. package/dist/pilot/runtime/events.d.ts +49 -0
  192. package/dist/pilot/runtime/events.d.ts.map +1 -0
  193. package/dist/pilot/runtime/events.js +36 -0
  194. package/dist/pilot/runtime/events.js.map +1 -0
  195. package/dist/pilot/runtime/index.d.ts +2 -0
  196. package/dist/pilot/runtime/index.d.ts.map +1 -1
  197. package/dist/pilot/runtime/index.js +3 -1
  198. package/dist/pilot/runtime/index.js.map +1 -1
  199. package/dist/pilot/runtime/runtime.d.ts.map +1 -1
  200. package/dist/pilot/runtime/runtime.js +69 -2
  201. package/dist/pilot/runtime/runtime.js.map +1 -1
  202. package/dist/pilot/runtime/types.d.ts +48 -0
  203. package/dist/pilot/runtime/types.d.ts.map +1 -1
  204. package/dist/pilot/state-graph/dom-skeleton.d.ts +96 -0
  205. package/dist/pilot/state-graph/dom-skeleton.d.ts.map +1 -0
  206. package/dist/pilot/state-graph/dom-skeleton.js +193 -0
  207. package/dist/pilot/state-graph/dom-skeleton.js.map +1 -0
  208. package/dist/pilot/state-graph/factory.d.ts +54 -0
  209. package/dist/pilot/state-graph/factory.d.ts.map +1 -0
  210. package/dist/pilot/state-graph/factory.js +82 -0
  211. package/dist/pilot/state-graph/factory.js.map +1 -0
  212. package/dist/pilot/state-graph/index.d.ts +30 -0
  213. package/dist/pilot/state-graph/index.d.ts.map +1 -0
  214. package/dist/pilot/state-graph/index.js +38 -0
  215. package/dist/pilot/state-graph/index.js.map +1 -0
  216. package/dist/pilot/state-graph/node-hash.d.ts +103 -0
  217. package/dist/pilot/state-graph/node-hash.d.ts.map +1 -0
  218. package/dist/pilot/state-graph/node-hash.js +0 -0
  219. package/dist/pilot/state-graph/node-hash.js.map +1 -0
  220. package/dist/resources/live-state.d.ts +1 -1
  221. package/dist/resources/live-state.d.ts.map +1 -1
  222. package/dist/resources/live-state.js +24 -0
  223. package/dist/resources/live-state.js.map +1 -1
  224. package/dist/router/browser-router.d.ts +7 -1
  225. package/dist/router/browser-router.d.ts.map +1 -1
  226. package/dist/router/browser-router.js +30 -5
  227. package/dist/router/browser-router.js.map +1 -1
  228. package/dist/run-harness/types.d.ts +1 -1
  229. package/dist/security/shared-profile-policy.d.ts +32 -0
  230. package/dist/security/shared-profile-policy.d.ts.map +1 -0
  231. package/dist/security/shared-profile-policy.js +48 -0
  232. package/dist/security/shared-profile-policy.js.map +1 -0
  233. package/dist/session/target-command-queue.d.ts +62 -0
  234. package/dist/session/target-command-queue.d.ts.map +1 -0
  235. package/dist/session/target-command-queue.js +136 -0
  236. package/dist/session/target-command-queue.js.map +1 -0
  237. package/dist/session/target-lease-registry.d.ts +47 -0
  238. package/dist/session/target-lease-registry.d.ts.map +1 -0
  239. package/dist/session/target-lease-registry.js +118 -0
  240. package/dist/session/target-lease-registry.js.map +1 -0
  241. package/dist/session-manager.d.ts +46 -1
  242. package/dist/session-manager.d.ts.map +1 -1
  243. package/dist/session-manager.js +187 -3
  244. package/dist/session-manager.js.map +1 -1
  245. package/dist/storage-state/fingerprint.d.ts +68 -0
  246. package/dist/storage-state/fingerprint.d.ts.map +1 -0
  247. package/dist/storage-state/fingerprint.js +153 -0
  248. package/dist/storage-state/fingerprint.js.map +1 -0
  249. package/dist/tools/_shared/path-meta.d.ts +40 -0
  250. package/dist/tools/_shared/path-meta.d.ts.map +1 -0
  251. package/dist/tools/_shared/path-meta.js +54 -0
  252. package/dist/tools/_shared/path-meta.js.map +1 -0
  253. package/dist/tools/act.d.ts +17 -0
  254. package/dist/tools/act.d.ts.map +1 -1
  255. package/dist/tools/act.js +96 -1
  256. package/dist/tools/act.js.map +1 -1
  257. package/dist/tools/connection-health.d.ts.map +1 -1
  258. package/dist/tools/connection-health.js +4 -0
  259. package/dist/tools/connection-health.js.map +1 -1
  260. package/dist/tools/image-qa.d.ts +49 -0
  261. package/dist/tools/image-qa.d.ts.map +1 -0
  262. package/dist/tools/image-qa.js +255 -0
  263. package/dist/tools/image-qa.js.map +1 -0
  264. package/dist/tools/index.d.ts.map +1 -1
  265. package/dist/tools/index.js +11 -0
  266. package/dist/tools/index.js.map +1 -1
  267. package/dist/tools/navigate.d.ts.map +1 -1
  268. package/dist/tools/navigate.js +5 -0
  269. package/dist/tools/navigate.js.map +1 -1
  270. package/dist/tools/oc-assert.d.ts +20 -0
  271. package/dist/tools/oc-assert.d.ts.map +1 -1
  272. package/dist/tools/oc-assert.js +79 -4
  273. package/dist/tools/oc-assert.js.map +1 -1
  274. package/dist/tools/oc-evidence-bundle.d.ts.map +1 -1
  275. package/dist/tools/oc-evidence-bundle.js +74 -6
  276. package/dist/tools/oc-evidence-bundle.js.map +1 -1
  277. package/dist/tools/oc-gate-inspect.d.ts +60 -0
  278. package/dist/tools/oc-gate-inspect.d.ts.map +1 -0
  279. package/dist/tools/oc-gate-inspect.js +145 -0
  280. package/dist/tools/oc-gate-inspect.js.map +1 -0
  281. package/dist/tools/oc-journal-compact.d.ts +25 -0
  282. package/dist/tools/oc-journal-compact.d.ts.map +1 -0
  283. package/dist/tools/oc-journal-compact.js +211 -0
  284. package/dist/tools/oc-journal-compact.js.map +1 -0
  285. package/dist/tools/oc-lane.d.ts.map +1 -1
  286. package/dist/tools/oc-lane.js +18 -1
  287. package/dist/tools/oc-lane.js.map +1 -1
  288. package/dist/tools/oc-skill-export.js +1 -1
  289. package/dist/tools/oc-skill-export.js.map +1 -1
  290. package/dist/tools/oc-skill-recall.d.ts +24 -2
  291. package/dist/tools/oc-skill-recall.d.ts.map +1 -1
  292. package/dist/tools/oc-skill-recall.js +105 -7
  293. package/dist/tools/oc-skill-recall.js.map +1 -1
  294. package/dist/tools/oc-skill-record.d.ts +7 -0
  295. package/dist/tools/oc-skill-record.d.ts.map +1 -1
  296. package/dist/tools/oc-skill-record.js +54 -0
  297. package/dist/tools/oc-skill-record.js.map +1 -1
  298. package/dist/tools/read-page.d.ts.map +1 -1
  299. package/dist/tools/read-page.js +3 -0
  300. package/dist/tools/read-page.js.map +1 -1
  301. package/dist/tools/session-resume.d.ts +4 -0
  302. package/dist/tools/session-resume.d.ts.map +1 -1
  303. package/dist/tools/session-resume.js +60 -0
  304. package/dist/tools/session-resume.js.map +1 -1
  305. package/dist/tools/shutdown.d.ts.map +1 -1
  306. package/dist/tools/shutdown.js +5 -2
  307. package/dist/tools/shutdown.js.map +1 -1
  308. package/dist/tools/task-run.d.ts +2 -2
  309. package/dist/tools/task-run.d.ts.map +1 -1
  310. package/dist/tools/task-run.js +79 -1
  311. package/dist/tools/task-run.js.map +1 -1
  312. package/dist/transports/broker-proxy.d.ts +28 -0
  313. package/dist/transports/broker-proxy.d.ts.map +1 -0
  314. package/dist/transports/broker-proxy.js +162 -0
  315. package/dist/transports/broker-proxy.js.map +1 -0
  316. package/dist/transports/http.d.ts.map +1 -1
  317. package/dist/transports/http.js +17 -4
  318. package/dist/transports/http.js.map +1 -1
  319. package/dist/transports/index.d.ts +2 -0
  320. package/dist/transports/index.d.ts.map +1 -1
  321. package/dist/transports/index.js.map +1 -1
  322. package/dist/types/browser-backend.d.ts +19 -0
  323. package/dist/types/browser-backend.d.ts.map +1 -1
  324. package/dist/types/tool-annotations.d.ts +3 -0
  325. package/dist/types/tool-annotations.d.ts.map +1 -1
  326. package/dist/types/tool-annotations.js +3 -0
  327. package/dist/types/tool-annotations.js.map +1 -1
  328. package/dist/utils/controller-lock.d.ts +41 -0
  329. package/dist/utils/controller-lock.d.ts.map +1 -0
  330. package/dist/utils/controller-lock.js +205 -0
  331. package/dist/utils/controller-lock.js.map +1 -0
  332. package/dist/utils/duplicate-controller-diagnostics.d.ts +55 -0
  333. package/dist/utils/duplicate-controller-diagnostics.d.ts.map +1 -0
  334. package/dist/utils/duplicate-controller-diagnostics.js +227 -0
  335. package/dist/utils/duplicate-controller-diagnostics.js.map +1 -0
  336. package/dist/watchdog/health-endpoint.d.ts +8 -0
  337. package/dist/watchdog/health-endpoint.d.ts.map +1 -1
  338. package/dist/watchdog/health-endpoint.js.map +1 -1
  339. package/package.json +8 -3
package/README.ko.md CHANGED
@@ -37,16 +37,21 @@ Chrome 프로세스 하나에 격리된 탭 여러 개, 20개 병렬 레인이 ~
37
37
 
38
38
  AI: [4개 병렬 레인, 모든 사이트 이미 인증됨]
39
39
  Best Buy $179 · Amazon $189 · Walmart $185 · eBay $172
40
- 2.4초 실시간 페이지, 봇 탐지 우회
40
+ 실시간 페이지 · 이미 인증됨 · 봇 탐지 우회
41
41
  ```
42
42
 
43
43
  | | 기존 방식 (Playwright 등) | OpenChrome |
44
44
  |---|:---:|:---:|
45
- | 5개 사이트 작업 | ~250초 (매번 로그인) | **~3초** (병렬) |
46
- | 메모리 | ~2.5GB (브라우저 5개) | **~300MB** (Chrome 1개) |
45
+ | 5개 사이트 작업* | ~250초 (매번 로그인) | **~3초** (병렬) |
46
+ | 메모리* | ~2.5GB (브라우저 5개) | **~300MB** (Chrome 1개) |
47
47
  | 재인증 | 매 실행마다 | **불필요** |
48
48
  | 봇 탐지 | 차단됨 | **투명** (실제 Chrome) |
49
49
 
50
+ <sub>\* 인증된 Chrome 1개 vs. 콜드 브라우저 N개라는 아키텍처 차이를 설명하기 위한
51
+ 예시이며, 측정된 경쟁 벤치마크 결과가 아닙니다. 정량적 속도/비용 수치는 live 또는
52
+ recorded-real 벤치마크 행으로만 헤드라인 주장이 됩니다 —
53
+ [`docs/benchmarks/benchmark-direction.md`](docs/benchmarks/benchmark-direction.md) 참고.</sub>
54
+
50
55
  ---
51
56
 
52
57
  ## 빠른 시작
@@ -98,7 +103,7 @@ MCP 클라이언트를 재시작하세요. 끝입니다 — 첫 도구 호출
98
103
  - **검증 가능한 실행** — `oc_assert`가 페이지 상태를 Outcome Contract로 검증 (pass / fail / inconclusive) — 추측 대신 계약.
99
104
 
100
105
  기본 도구 표면은 내비게이션·상호작용·읽기·추출·병렬 워크플로·계약·스킬·복구·진단에
101
- 걸쳐 약 110개입니다. 전체 목록: [`docs/agent/capability-map.md`](docs/agent/capability-map.md).
106
+ 걸쳐 118개입니다. 전체 목록: [`docs/agent/capability-map.md`](docs/agent/capability-map.md).
102
107
 
103
108
  ---
104
109
 
@@ -180,14 +185,16 @@ query_dom → inspect → interact` 대신 **바로 실행 가능한 번호 목
180
185
  | **결과 분류기** | 클릭 후 실제로 무슨 일이 일어났는지 보고 (SUCCESS / SILENT_CLICK / WRONG_ELEMENT). |
181
186
  | **49개 신뢰성 메커니즘** | 프로세스 수명부터 MCP 게이트웨이까지 8개 방어 계층 — 단일 실패로 서버가 멈추지 않음. [`docs/architecture.md`](docs/architecture.md) 참고. |
182
187
 
183
- 일반적인 5개 사이트 작업 기준: LLM 호출 ~80% 감소, 실제 소요 시간 ~80배 단축,
184
- 비용 ~5배 절감.
188
+ 하니스는 think-act 루프를 줄이도록 설계됐습니다: LLM 왕복 감소, 실제 소요 시간
189
+ 단축, 비용 절감. 구체적인 속도/비용 배수는 live 또는 recorded-real 벤치마크 행으로
190
+ 뒷받침될 때에만 헤드라인 주장으로 게시됩니다 —
191
+ [`docs/benchmarks/benchmark-direction.md`](docs/benchmarks/benchmark-direction.md) 참고.
185
192
 
186
193
  ---
187
194
 
188
195
  ## 알아두면 좋은 그 외 기능
189
196
 
190
- - **병렬 세션** — Chrome 1개, 탭/레인 N개; `workerId` + `profileDirectory`로 클라이언트별 격리. 여러 MCP 클라이언트가 안전하게 탭을 공유.
197
+ - **병렬 세션** — Chrome 1개, 탭/레인 N개; `workerId` + `profileDirectory`로 클라이언트별 격리. 여러 MCP 클라이언트는 단일 broker/HTTP 소유자를 통해 연결할 때(`--broker` / `--connect-broker`) 하나의 Chrome을 안전하게 공유합니다. 독립 stdio 클라이언트는 `--port` / `--user-data-dir` 프로파일을 분리하세요. [`docs/mcp/topologies.md`](docs/mcp/topologies.md) 참고.
191
198
  - **봇 차단 / Turnstile 대응** — 3단계 자동 폴백 (headless → stealth → 실제 headed Chrome)으로 CDN/WAF 차단 우회. [Turnstile 가이드](docs/turnstile-guide.md).
192
199
  - **대화형 로그인** — 런처가 기본적으로 화면에 보이게 실행되므로 2FA/CAPTCHA를 한 번 완료한 뒤 영구 프로필을 재사용.
193
200
  - **세션 지속성** — `--persist-storage`로 쿠키 + localStorage를 원자적으로 저장해 headless에서 재사용.
package/README.md CHANGED
@@ -24,7 +24,7 @@
24
24
  ## What it is
25
25
 
26
26
  OpenChrome is an **MCP server** that controls your real, already-logged-in Chrome
27
- through the CDP — no middleware, no separate browser, no re-authentication.
27
+ through the CDP — no middleware, no separate browser, no re-authentication.
28
28
  One Chrome process, many isolated tabs, ~300 MB for 20 parallel lanes.
29
29
 
30
30
  It is **harness-engineered**: the server doesn't just expose browser APIs, it wraps
@@ -37,16 +37,21 @@ You: compare "AirPods Pro" prices across Amazon, eBay, Walmart, Best Buy
37
37
 
38
38
  AI: [4 parallel lanes, already authenticated everywhere]
39
39
  Best Buy $179 · Amazon $189 · Walmart $185 · eBay $172
40
- 2.4s — live pages, past bot detection
40
+ live pages · already authenticated · past bot detection
41
41
  ```
42
42
 
43
43
  | | Traditional (Playwright et al.) | OpenChrome |
44
44
  |---|:---:|:---:|
45
- | 5-site task | ~250s (login each) | **~3s** (parallel) |
46
- | Memory | ~2.5 GB (5 browsers) | **~300 MB** (1 Chrome) |
45
+ | 5-site task* | ~250s (login each) | **~3s** (parallel) |
46
+ | Memory* | ~2.5 GB (5 browsers) | **~300 MB** (1 Chrome) |
47
47
  | Re-auth | every run | **never** |
48
48
  | Bot detection | flagged | **invisible** (real Chrome) |
49
49
 
50
+ <sub>\* Illustrative of the architectural difference (one authenticated Chrome vs. N cold
51
+ browsers), not benchmarked competitive results. Quantitative speed/cost figures become
52
+ headline claims only as live or recorded-real benchmark rows — see
53
+ [`docs/benchmarks/benchmark-direction.md`](docs/benchmarks/benchmark-direction.md).</sub>
54
+
50
55
  ---
51
56
 
52
57
  ## Quick start
@@ -63,6 +68,9 @@ npx openchrome-mcp setup --client opencode # OpenCode
63
68
 
64
69
  Restart your MCP client. That's it — Chrome auto-launches on first tool call.
65
70
 
71
+ For manual Codex CLI configuration, run `openchrome config --client codex`
72
+ and add the printed `[mcp_servers.openchrome]` block to `~/.codex/config.toml`.
73
+
66
74
  <details>
67
75
  <summary>Manual MCP config (Cursor / VS Code / Windsurf / others)</summary>
68
76
 
@@ -97,7 +105,7 @@ Ask your agent in plain language — these all map to OpenChrome tools:
97
105
  - **Crawling** — async `crawl_start` / `crawl_status` / `crawl_cancel` jobs with cursor pagination.
98
106
  - **Verifiable runs** — `oc_assert` checks page state against an Outcome Contract (pass / fail / inconclusive) instead of guessing.
99
107
 
100
- The default surface is ~110 tools across navigation, interaction, reading,
108
+ The default surface is 118 tools across navigation, interaction, reading,
101
109
  extraction, parallel workflows, contracts, skills, recovery, and diagnostics.
102
110
  Full catalogue: [`docs/agent/capability-map.md`](docs/agent/capability-map.md).
103
111
 
@@ -182,14 +190,16 @@ wrong guess costs 10–15s of inference. OpenChrome's harness cuts that loop:
182
190
  | **Outcome classifier** | Reports what *actually* happened after a click (SUCCESS / SILENT_CLICK / WRONG_ELEMENT). |
183
191
  | **49 reliability mechanisms** | 8 defense layers from process lifecycle to MCP gateway — no single failure hangs the server. See [`docs/architecture.md`](docs/architecture.md). |
184
192
 
185
- Result on a typical 5-site task: ~80% fewer LLM calls, ~80x faster wall time,
186
- ~5x cheaper.
193
+ The harness is designed to cut the think-act loop: fewer LLM round-trips, faster
194
+ wall time, lower cost. Specific speed/cost multipliers are published as headline
195
+ claims only when backed by live or recorded-real benchmark rows — see
196
+ [`docs/benchmarks/benchmark-direction.md`](docs/benchmarks/benchmark-direction.md).
187
197
 
188
198
  ---
189
199
 
190
200
  ## Other capabilities worth knowing
191
201
 
192
- - **Parallel sessions** — 1 Chrome, N tabs/lanes; `workerId` + `profileDirectory` give per-client isolation. Multiple MCP clients can share tabs safely.
202
+ - **Parallel sessions** — 1 Chrome, N tabs/lanes; `workerId` + `profileDirectory` give per-client isolation. Multiple MCP clients can share one Chrome safely when they connect through a single broker/HTTP owner (`--broker` / `--connect-broker`); independent stdio clients should use separate `--port` / `--user-data-dir` profiles. See [`docs/mcp/topologies.md`](docs/mcp/topologies.md).
193
203
  - **Anti-bot / Turnstile** — 3-tier auto-fallback (headless → stealth → real headed Chrome) bypasses CDN/WAF blocks. [Turnstile guide](docs/turnstile-guide.md).
194
204
  - **Interactive login** — headed by default since the launcher runs visible; complete 2FA/CAPTCHA once, reuse the persistent profile after.
195
205
  - **Session persistence** — `--persist-storage` saves cookies + localStorage atomically for headless reuse.
@@ -214,6 +224,57 @@ Transport stability policy: [`docs/transport-lifecycle.md`](docs/transport-lifec
214
224
 
215
225
  ---
216
226
 
227
+ ## Host plugins
228
+
229
+ OpenChrome ships plugin manifests for Claude Code and Codex CLI so both hosts
230
+ load the MCP server and skill body from the **same shared source** — no
231
+ per-host duplication.
232
+
233
+ ### Claude Code
234
+
235
+ Load from the repo for local development:
236
+
237
+ ```bash
238
+ claude --plugin-dir /path/to/openchrome
239
+ ```
240
+
241
+ Or install from npm after the package is published to a marketplace:
242
+
243
+ ```bash
244
+ /plugin install openchrome # once listed in a marketplace
245
+ ```
246
+
247
+ The skill body lives under `skills/openchrome/` and the `/openchrome:connect`
248
+ slash command is registered from the top-level `commands/` directory. Run
249
+ `/reload-plugins` after updating to pick up new content.
250
+
251
+ Manifest: `.claude-plugin/plugin.json` — registers the `openchrome` MCP server
252
+ (`openchrome serve --auto-launch`). Skills and commands are auto-discovered
253
+ from `skills/` and `commands/`.
254
+
255
+ ### Codex CLI
256
+
257
+ Load from the repo for local development:
258
+
259
+ ```bash
260
+ codex --plugin-dir /path/to/openchrome
261
+ ```
262
+
263
+ Or follow the Codex plugin installation instructions once the package is listed
264
+ in the Codex plugin registry.
265
+
266
+ Manifest: `.codex-plugin/plugin.json` — identical MCP server entry point and
267
+ skill path; the two manifests share the same `skills/openchrome/` body.
268
+
269
+ ### Shared skill body
270
+
271
+ Both manifests share `skills/openchrome/SKILL.md` as the single source of
272
+ truth for skill content, and the slash command stub at `commands/connect.md`
273
+ registers `/openchrome:connect`. The `commands/` directory sits at the plugin
274
+ root so both hosts auto-discover it.
275
+
276
+ ---
277
+
217
278
  ## Documentation
218
279
 
219
280
  | Topic | Link |
@@ -224,7 +285,7 @@ Transport stability policy: [`docs/transport-lifecycle.md`](docs/transport-lifec
224
285
  | CLI & playbook | [`docs/cli.md`](docs/cli.md) · [`docs/cli/playbook.md`](docs/cli/playbook.md) |
225
286
  | HTTP daemon mode | [`docs/getting-started/http-daemon.md`](docs/getting-started/http-daemon.md) |
226
287
  | Research recipes | [`docs/recipes/README.md`](docs/recipes/README.md) |
227
- | Latest release notes | [`docs/releases/v1.12.4.md`](docs/releases/v1.12.4.md) |
288
+ | Latest release notes | [`docs/releases/v1.12.5.md`](docs/releases/v1.12.5.md) |
228
289
 
229
290
  ---
230
291
 
@@ -0,0 +1,27 @@
1
+ export interface BrokerIdentity {
2
+ port: number;
3
+ userDataDir: string;
4
+ httpHost: string;
5
+ httpPort: number;
6
+ pid?: number;
7
+ startedAt?: string;
8
+ version?: string;
9
+ authTokenEnv?: string;
10
+ }
11
+ export interface BrokerMetadata {
12
+ schemaVersion: 1;
13
+ pid: number;
14
+ version: string;
15
+ startedAt: string;
16
+ port: number;
17
+ userDataDir: string;
18
+ endpoint: string;
19
+ authTokenEnv?: string;
20
+ }
21
+ export declare function getBrokerRegistryDir(rootDir?: string | undefined): string;
22
+ export declare function getBrokerMetadataPath(port: number, userDataDir: string, rootDir?: string): string;
23
+ export declare function buildBrokerMetadata(identity: BrokerIdentity): BrokerMetadata;
24
+ export declare function publishBrokerMetadata(identity: BrokerIdentity, rootDir?: string): BrokerMetadata;
25
+ export declare function readBrokerMetadata(port: number, userDataDir: string, rootDir?: string): BrokerMetadata | null;
26
+ export declare function removeBrokerMetadata(port: number, userDataDir: string, pid?: number, rootDir?: string): void;
27
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/broker/discovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,CAAC,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,qBAA6C,GAAG,MAAM,CAEjG;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjG;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,CAY5E;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAMhG;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAS7G;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAKjH"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getBrokerRegistryDir = getBrokerRegistryDir;
37
+ exports.getBrokerMetadataPath = getBrokerMetadataPath;
38
+ exports.buildBrokerMetadata = buildBrokerMetadata;
39
+ exports.publishBrokerMetadata = publishBrokerMetadata;
40
+ exports.readBrokerMetadata = readBrokerMetadata;
41
+ exports.removeBrokerMetadata = removeBrokerMetadata;
42
+ const fs = __importStar(require("fs"));
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ const version_1 = require("../version");
46
+ const controller_lock_1 = require("../utils/controller-lock");
47
+ function getBrokerRegistryDir(rootDir = process.env.OPENCHROME_BROKER_REGISTRY_DIR) {
48
+ return rootDir || path.join(os.homedir(), '.openchrome', 'brokers');
49
+ }
50
+ function getBrokerMetadataPath(port, userDataDir, rootDir) {
51
+ return path.join(getBrokerRegistryDir(rootDir), `${(0, controller_lock_1.controllerLockKey)(port, userDataDir)}.json`);
52
+ }
53
+ function normalizeHost(host) {
54
+ return host === '0.0.0.0' ? '127.0.0.1' : host;
55
+ }
56
+ function buildBrokerMetadata(identity) {
57
+ const userDataDir = (0, controller_lock_1.normalizeControllerUserDataDir)(identity.userDataDir);
58
+ return {
59
+ schemaVersion: 1,
60
+ pid: identity.pid ?? process.pid,
61
+ version: identity.version ?? (0, version_1.getVersion)(),
62
+ startedAt: identity.startedAt ?? new Date().toISOString(),
63
+ port: identity.port,
64
+ userDataDir,
65
+ endpoint: `http://${normalizeHost(identity.httpHost)}:${identity.httpPort}/mcp`,
66
+ ...(identity.authTokenEnv ? { authTokenEnv: identity.authTokenEnv } : {}),
67
+ };
68
+ }
69
+ function publishBrokerMetadata(identity, rootDir) {
70
+ const metadata = buildBrokerMetadata(identity);
71
+ const filePath = getBrokerMetadataPath(identity.port, metadata.userDataDir, rootDir);
72
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
73
+ fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\n', { mode: 0o600 });
74
+ return metadata;
75
+ }
76
+ function readBrokerMetadata(port, userDataDir, rootDir) {
77
+ const filePath = getBrokerMetadataPath(port, userDataDir, rootDir);
78
+ try {
79
+ const metadata = JSON.parse(fs.readFileSync(filePath, 'utf8'));
80
+ if (metadata.schemaVersion !== 1 || typeof metadata.endpoint !== 'string' || typeof metadata.pid !== 'number')
81
+ return null;
82
+ return metadata;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ function removeBrokerMetadata(port, userDataDir, pid = process.pid, rootDir) {
89
+ const filePath = getBrokerMetadataPath(port, userDataDir, rootDir);
90
+ const existing = readBrokerMetadata(port, userDataDir, rootDir);
91
+ if (existing && existing.pid !== pid)
92
+ return;
93
+ try {
94
+ fs.unlinkSync(filePath);
95
+ }
96
+ catch { /* best effort */ }
97
+ }
98
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/broker/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type BrokerLifecycleMode = 'disabled' | 'owner';
2
+ export type BrokerLifecycleState = 'idle' | 'running' | 'reconnecting' | 'stopping' | 'stopped';
3
+ export interface BrokerLifecycleSnapshot {
4
+ mode: BrokerLifecycleMode;
5
+ state: BrokerLifecycleState;
6
+ startedAt: string | null;
7
+ updatedAt: string | null;
8
+ reconnectCount: number;
9
+ lastEvent: string | null;
10
+ ocStopDefaultKeepChrome: boolean;
11
+ }
12
+ export declare function setBrokerOwnerMode(enabled: boolean): BrokerLifecycleSnapshot;
13
+ export declare function recordBrokerReconnect(event: 'reconnecting' | 'reconnected' | 'reconnect_failed'): BrokerLifecycleSnapshot;
14
+ export declare function recordBrokerStopping(): BrokerLifecycleSnapshot;
15
+ export declare function recordBrokerStopped(): BrokerLifecycleSnapshot;
16
+ export declare function shouldOcStopKeepChromeByDefault(): boolean;
17
+ export declare function getBrokerLifecycleSnapshot(): BrokerLifecycleSnapshot;
18
+ export declare function resetBrokerLifecycleForTest(): void;
19
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/broker/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhG,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAgBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,uBAAuB,CAS5E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,GAAG,kBAAkB,GAAG,uBAAuB,CAYzH;AAED,wBAAgB,oBAAoB,IAAI,uBAAuB,CAK9D;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,CAK7D;AAED,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setBrokerOwnerMode = setBrokerOwnerMode;
4
+ exports.recordBrokerReconnect = recordBrokerReconnect;
5
+ exports.recordBrokerStopping = recordBrokerStopping;
6
+ exports.recordBrokerStopped = recordBrokerStopped;
7
+ exports.shouldOcStopKeepChromeByDefault = shouldOcStopKeepChromeByDefault;
8
+ exports.getBrokerLifecycleSnapshot = getBrokerLifecycleSnapshot;
9
+ exports.resetBrokerLifecycleForTest = resetBrokerLifecycleForTest;
10
+ const lifecycle = {
11
+ mode: 'disabled',
12
+ state: 'idle',
13
+ startedAt: null,
14
+ updatedAt: null,
15
+ reconnectCount: 0,
16
+ lastEvent: null,
17
+ ocStopDefaultKeepChrome: false,
18
+ };
19
+ function nowIso() {
20
+ return new Date().toISOString();
21
+ }
22
+ function setBrokerOwnerMode(enabled) {
23
+ const now = nowIso();
24
+ lifecycle.mode = enabled ? 'owner' : 'disabled';
25
+ lifecycle.state = enabled ? 'running' : 'idle';
26
+ lifecycle.startedAt = enabled ? lifecycle.startedAt ?? now : null;
27
+ lifecycle.updatedAt = now;
28
+ lifecycle.lastEvent = enabled ? 'broker_owner_started' : 'broker_owner_disabled';
29
+ lifecycle.ocStopDefaultKeepChrome = enabled;
30
+ return getBrokerLifecycleSnapshot();
31
+ }
32
+ function recordBrokerReconnect(event) {
33
+ lifecycle.updatedAt = nowIso();
34
+ lifecycle.lastEvent = event;
35
+ if (event === 'reconnecting') {
36
+ lifecycle.state = 'reconnecting';
37
+ }
38
+ else if (event === 'reconnected') {
39
+ lifecycle.state = lifecycle.mode === 'owner' ? 'running' : 'idle';
40
+ lifecycle.reconnectCount += 1;
41
+ }
42
+ else {
43
+ lifecycle.state = 'reconnecting';
44
+ }
45
+ return getBrokerLifecycleSnapshot();
46
+ }
47
+ function recordBrokerStopping() {
48
+ lifecycle.updatedAt = nowIso();
49
+ lifecycle.state = 'stopping';
50
+ lifecycle.lastEvent = 'broker_owner_stopping';
51
+ return getBrokerLifecycleSnapshot();
52
+ }
53
+ function recordBrokerStopped() {
54
+ lifecycle.updatedAt = nowIso();
55
+ lifecycle.state = 'stopped';
56
+ lifecycle.lastEvent = 'broker_owner_stopped';
57
+ return getBrokerLifecycleSnapshot();
58
+ }
59
+ function shouldOcStopKeepChromeByDefault() {
60
+ return lifecycle.ocStopDefaultKeepChrome;
61
+ }
62
+ function getBrokerLifecycleSnapshot() {
63
+ return { ...lifecycle };
64
+ }
65
+ function resetBrokerLifecycleForTest() {
66
+ lifecycle.mode = 'disabled';
67
+ lifecycle.state = 'idle';
68
+ lifecycle.startedAt = null;
69
+ lifecycle.updatedAt = null;
70
+ lifecycle.reconnectCount = 0;
71
+ lifecycle.lastEvent = null;
72
+ lifecycle.ocStopDefaultKeepChrome = false;
73
+ }
74
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/broker/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -295,6 +295,7 @@ export declare class CDPClient {
295
295
  * @param skipCookieBridge If true, skip cookie bridging from authenticated pages (used for pool pre-warming)
296
296
  */
297
297
  createPage(url?: string, context?: BrowserContext | null, skipCookieBridge?: boolean): Promise<Page>;
298
+ private findReusableStartupPage;
298
299
  /**
299
300
  * Open a new tab via Chrome's HTTP debug API without attaching CDP during load.
300
301
  * This avoids the Runtime.enable serialization artifacts that Cloudflare Turnstile
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
@@ -1490,14 +1490,22 @@ class CDPClient {
1490
1490
  ]);
1491
1491
  }
1492
1492
  else {
1493
- // Create page in Chrome's default context
1494
- let newPageTid2;
1495
- page = await Promise.race([
1496
- browser.newPage().finally(() => clearTimeout(newPageTid2)),
1497
- new Promise((_, reject) => {
1498
- newPageTid2 = setTimeout(() => reject(new Error(`newPage() timed out after ${defaults_1.DEFAULT_NEW_PAGE_TIMEOUT_MS}ms`)), defaults_1.DEFAULT_NEW_PAGE_TIMEOUT_MS);
1499
- }),
1500
- ]);
1493
+ const startupPage = await this.findReusableStartupPage(browser);
1494
+ if (startupPage) {
1495
+ page = startupPage;
1496
+ skipCookieBridge = true;
1497
+ console.error(`[CDPClient] Reused startup tab ${(0, puppeteer_helpers_1.getTargetId)(page.target())} for first default-context page`);
1498
+ }
1499
+ else {
1500
+ // Create page in Chrome's default context
1501
+ let newPageTid2;
1502
+ page = await Promise.race([
1503
+ browser.newPage().finally(() => clearTimeout(newPageTid2)),
1504
+ new Promise((_, reject) => {
1505
+ newPageTid2 = setTimeout(() => reject(new Error(`newPage() timed out after ${defaults_1.DEFAULT_NEW_PAGE_TIMEOUT_MS}ms`)), defaults_1.DEFAULT_NEW_PAGE_TIMEOUT_MS);
1506
+ }),
1507
+ ]);
1508
+ }
1501
1509
  // Copy cookies from an authenticated page (skip for pool pre-warming to avoid
1502
1510
  // CDP session conflicts and unnecessary overhead on about:blank pages).
1503
1511
  // The global skipCookieBridge flag serves as a manual override escape hatch.
@@ -1550,7 +1558,11 @@ class CDPClient {
1550
1558
  (0, domain_guard_1.assertDomainAllowed)(page.url());
1551
1559
  }
1552
1560
  catch (err) {
1553
- // Close the page to prevent about:blank ghost tabs on navigation failure
1561
+ // Close the page to prevent about:blank ghost tabs on navigation failure.
1562
+ // When `page` came from findReusableStartupPage the closed tab is the
1563
+ // startup NTP — that's intentional: reuse is gated to isolated-mode
1564
+ // (OpenChrome owns Chrome), so the user does not see a stuck about:blank
1565
+ // from a failed first navigation.
1554
1566
  const targetId = (0, puppeteer_helpers_1.getTargetId)(page.target());
1555
1567
  this.targetIdIndex.delete(targetId);
1556
1568
  await page.close().catch(() => { });
@@ -1559,6 +1571,30 @@ class CDPClient {
1559
1571
  }
1560
1572
  return page;
1561
1573
  }
1574
+ async findReusableStartupPage(browser) {
1575
+ if (this.targetIdIndex.size !== 0 || this.getChromeLifecycleMode() !== 'isolated')
1576
+ return null;
1577
+ const candidates = browser.targets().filter((target) => {
1578
+ if (target.type() !== 'page')
1579
+ return false;
1580
+ const targetId = (0, puppeteer_helpers_1.getTargetId)(target);
1581
+ if (!targetId || this.targetIdIndex.has(targetId))
1582
+ return false;
1583
+ const targetUrl = target.url();
1584
+ return targetUrl === ''
1585
+ || targetUrl === 'about:blank'
1586
+ || targetUrl === 'chrome://newtab/'
1587
+ || targetUrl.startsWith('chrome://new-tab-page');
1588
+ });
1589
+ if (candidates.length !== 1)
1590
+ return null;
1591
+ try {
1592
+ return await candidates[0].page();
1593
+ }
1594
+ catch {
1595
+ return null;
1596
+ }
1597
+ }
1562
1598
  /**
1563
1599
  * Open a new tab via Chrome's HTTP debug API without attaching CDP during load.
1564
1600
  * This avoids the Runtime.enable serialization artifacts that Cloudflare Turnstile