openchrome-mcp 1.12.5 → 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.
- package/README.ko.md +14 -7
- package/README.md +68 -7
- package/dist/broker/discovery.d.ts +27 -0
- package/dist/broker/discovery.d.ts.map +1 -0
- package/dist/broker/discovery.js +98 -0
- package/dist/broker/discovery.js.map +1 -0
- package/dist/broker/lifecycle.d.ts +19 -0
- package/dist/broker/lifecycle.d.ts.map +1 -0
- package/dist/broker/lifecycle.js +74 -0
- package/dist/broker/lifecycle.js.map +1 -0
- package/dist/cdp/client.d.ts +1 -0
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +58 -60
- package/dist/cdp/client.js.map +1 -1
- package/dist/cli/doctor/checks/duplicate-controllers.d.ts +7 -0
- package/dist/cli/doctor/checks/duplicate-controllers.d.ts.map +1 -0
- package/dist/cli/doctor/checks/duplicate-controllers.js +30 -0
- package/dist/cli/doctor/checks/duplicate-controllers.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +2 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +48 -17
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-client-config.d.ts +10 -0
- package/dist/cli/mcp-client-config.js +61 -3
- package/dist/cli/mcp-client-config.js.map +1 -1
- package/dist/cli/update-command.d.ts +6 -1
- package/dist/cli/update-command.js +12 -0
- package/dist/cli/update-command.js.map +1 -1
- package/dist/contracts/eval-context.d.ts +17 -0
- package/dist/contracts/eval-context.d.ts.map +1 -1
- package/dist/contracts/evaluate.d.ts.map +1 -1
- package/dist/contracts/evaluate.js +3 -0
- package/dist/contracts/evaluate.js.map +1 -1
- package/dist/contracts/evaluators/image-qa.d.ts +14 -0
- package/dist/contracts/evaluators/image-qa.d.ts.map +1 -0
- package/dist/contracts/evaluators/image-qa.js +95 -0
- package/dist/contracts/evaluators/image-qa.js.map +1 -0
- package/dist/contracts/templates/default-registry.d.ts +31 -0
- package/dist/contracts/templates/default-registry.d.ts.map +1 -0
- package/dist/contracts/templates/default-registry.js +54 -0
- package/dist/contracts/templates/default-registry.js.map +1 -0
- package/dist/contracts/templates/index.d.ts +12 -0
- package/dist/contracts/templates/index.d.ts.map +1 -0
- package/dist/contracts/templates/index.js +18 -0
- package/dist/contracts/templates/index.js.map +1 -0
- package/dist/contracts/templates/public-web/authenticated-fields.d.ts +34 -0
- package/dist/contracts/templates/public-web/authenticated-fields.d.ts.map +1 -0
- package/dist/contracts/templates/public-web/authenticated-fields.js +82 -0
- package/dist/contracts/templates/public-web/authenticated-fields.js.map +1 -0
- package/dist/contracts/templates/public-web/link-graph.d.ts +24 -0
- package/dist/contracts/templates/public-web/link-graph.d.ts.map +1 -0
- package/dist/contracts/templates/public-web/link-graph.js +64 -0
- package/dist/contracts/templates/public-web/link-graph.js.map +1 -0
- package/dist/contracts/templates/public-web/page-meta.d.ts +22 -0
- package/dist/contracts/templates/public-web/page-meta.d.ts.map +1 -0
- package/dist/contracts/templates/public-web/page-meta.js +57 -0
- package/dist/contracts/templates/public-web/page-meta.js.map +1 -0
- package/dist/contracts/templates/public-web/spa-hydrated.d.ts +31 -0
- package/dist/contracts/templates/public-web/spa-hydrated.d.ts.map +1 -0
- package/dist/contracts/templates/public-web/spa-hydrated.js +81 -0
- package/dist/contracts/templates/public-web/spa-hydrated.js.map +1 -0
- package/dist/contracts/templates/registry.d.ts +59 -0
- package/dist/contracts/templates/registry.d.ts.map +1 -0
- package/dist/contracts/templates/registry.js +157 -0
- package/dist/contracts/templates/registry.js.map +1 -0
- package/dist/contracts/templates/types.d.ts +84 -0
- package/dist/contracts/templates/types.d.ts.map +1 -0
- package/dist/contracts/templates/types.js +53 -0
- package/dist/contracts/templates/types.js.map +1 -0
- package/dist/contracts/types.d.ts +15 -1
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/validator.d.ts.map +1 -1
- package/dist/contracts/validator.js +15 -0
- package/dist/contracts/validator.js.map +1 -1
- package/dist/core/browser-lanes.d.ts +21 -0
- package/dist/core/browser-lanes.d.ts.map +1 -1
- package/dist/core/browser-lanes.js +94 -8
- package/dist/core/browser-lanes.js.map +1 -1
- package/dist/core/codegen/aggregator.d.ts +1 -0
- package/dist/core/codegen/aggregator.d.ts.map +1 -1
- package/dist/core/codegen/aggregator.js +24 -2
- package/dist/core/codegen/aggregator.js.map +1 -1
- package/dist/core/contracts/evidence-bundle.d.ts +44 -1
- package/dist/core/contracts/evidence-bundle.d.ts.map +1 -1
- package/dist/core/contracts/evidence-bundle.js +32 -1
- package/dist/core/contracts/evidence-bundle.js.map +1 -1
- package/dist/core/contracts/promotion-gate.d.ts +75 -0
- package/dist/core/contracts/promotion-gate.d.ts.map +1 -0
- package/dist/core/contracts/promotion-gate.js +82 -0
- package/dist/core/contracts/promotion-gate.js.map +1 -0
- package/dist/core/contracts/schema-diff.d.ts +89 -0
- package/dist/core/contracts/schema-diff.d.ts.map +1 -0
- package/dist/core/contracts/schema-diff.js +120 -0
- package/dist/core/contracts/schema-diff.js.map +1 -0
- package/dist/core/skill-memory/index.d.ts +2 -2
- package/dist/core/skill-memory/index.d.ts.map +1 -1
- package/dist/core/skill-memory/index.js +2 -1
- package/dist/core/skill-memory/index.js.map +1 -1
- package/dist/core/skill-memory/promote.d.ts +79 -0
- package/dist/core/skill-memory/promote.d.ts.map +1 -0
- package/dist/core/skill-memory/promote.js +83 -0
- package/dist/core/skill-memory/promote.js.map +1 -0
- package/dist/core/skill-memory/store.d.ts +12 -0
- package/dist/core/skill-memory/store.d.ts.map +1 -1
- package/dist/core/skill-memory/store.js +117 -12
- package/dist/core/skill-memory/store.js.map +1 -1
- package/dist/core/skill-memory/types.d.ts +104 -14
- package/dist/core/skill-memory/types.d.ts.map +1 -1
- package/dist/core/skill-memory/types.js +14 -11
- package/dist/core/skill-memory/types.js.map +1 -1
- package/dist/core/task-ledger/budget.d.ts.map +1 -1
- package/dist/core/task-ledger/budget.js +32 -0
- package/dist/core/task-ledger/budget.js.map +1 -1
- package/dist/core/task-ledger/early-stop.d.ts +66 -0
- package/dist/core/task-ledger/early-stop.d.ts.map +1 -0
- package/dist/core/task-ledger/early-stop.js +83 -0
- package/dist/core/task-ledger/early-stop.js.map +1 -0
- package/dist/core/task-ledger/marginal-utility.d.ts +98 -0
- package/dist/core/task-ledger/marginal-utility.d.ts.map +1 -0
- package/dist/core/task-ledger/marginal-utility.js +132 -0
- package/dist/core/task-ledger/marginal-utility.js.map +1 -0
- package/dist/core/task-ledger/types.d.ts +47 -0
- package/dist/core/task-ledger/types.d.ts.map +1 -1
- package/dist/gates/detect-other-gates.d.ts +60 -0
- package/dist/gates/detect-other-gates.d.ts.map +1 -0
- package/dist/gates/detect-other-gates.js +212 -0
- package/dist/gates/detect-other-gates.js.map +1 -0
- package/dist/index.js +124 -10
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +34 -3
- package/dist/mcp-server.js.map +1 -1
- package/dist/observability/request-id.d.ts +2 -0
- package/dist/observability/request-id.d.ts.map +1 -1
- package/dist/observability/request-id.js.map +1 -1
- package/dist/orchestration/state-manager.d.ts +2 -0
- package/dist/orchestration/state-manager.d.ts.map +1 -1
- package/dist/orchestration/state-manager.js +56 -32
- package/dist/orchestration/state-manager.js.map +1 -1
- package/dist/pilot/state-graph/factory.d.ts +3 -4
- package/dist/pilot/state-graph/factory.d.ts.map +1 -1
- package/dist/pilot/state-graph/factory.js +3 -4
- package/dist/pilot/state-graph/factory.js.map +1 -1
- package/dist/resources/live-state.d.ts +1 -1
- package/dist/resources/live-state.d.ts.map +1 -1
- package/dist/resources/live-state.js +24 -0
- package/dist/resources/live-state.js.map +1 -1
- package/dist/router/browser-router.d.ts +7 -1
- package/dist/router/browser-router.d.ts.map +1 -1
- package/dist/router/browser-router.js +30 -5
- package/dist/router/browser-router.js.map +1 -1
- package/dist/run-harness/types.d.ts +1 -1
- package/dist/security/shared-profile-policy.d.ts +32 -0
- package/dist/security/shared-profile-policy.d.ts.map +1 -0
- package/dist/security/shared-profile-policy.js +48 -0
- package/dist/security/shared-profile-policy.js.map +1 -0
- package/dist/session/target-command-queue.d.ts +62 -0
- package/dist/session/target-command-queue.d.ts.map +1 -0
- package/dist/session/target-command-queue.js +136 -0
- package/dist/session/target-command-queue.js.map +1 -0
- package/dist/session/target-lease-registry.d.ts +47 -0
- package/dist/session/target-lease-registry.d.ts.map +1 -0
- package/dist/session/target-lease-registry.js +118 -0
- package/dist/session/target-lease-registry.js.map +1 -0
- package/dist/session-manager.d.ts +46 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +187 -3
- package/dist/session-manager.js.map +1 -1
- package/dist/storage-state/fingerprint.d.ts +68 -0
- package/dist/storage-state/fingerprint.d.ts.map +1 -0
- package/dist/storage-state/fingerprint.js +153 -0
- package/dist/storage-state/fingerprint.js.map +1 -0
- package/dist/tools/_shared/path-meta.d.ts +40 -0
- package/dist/tools/_shared/path-meta.d.ts.map +1 -0
- package/dist/tools/_shared/path-meta.js +54 -0
- package/dist/tools/_shared/path-meta.js.map +1 -0
- package/dist/tools/act.d.ts +17 -0
- package/dist/tools/act.d.ts.map +1 -1
- package/dist/tools/act.js +96 -1
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/connection-health.d.ts.map +1 -1
- package/dist/tools/connection-health.js +4 -0
- package/dist/tools/connection-health.js.map +1 -1
- package/dist/tools/image-qa.d.ts +49 -0
- package/dist/tools/image-qa.d.ts.map +1 -0
- package/dist/tools/image-qa.js +255 -0
- package/dist/tools/image-qa.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +5 -0
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/oc-assert.d.ts +20 -0
- package/dist/tools/oc-assert.d.ts.map +1 -1
- package/dist/tools/oc-assert.js +79 -4
- package/dist/tools/oc-assert.js.map +1 -1
- package/dist/tools/oc-evidence-bundle.d.ts.map +1 -1
- package/dist/tools/oc-evidence-bundle.js +74 -6
- package/dist/tools/oc-evidence-bundle.js.map +1 -1
- package/dist/tools/oc-gate-inspect.d.ts +60 -0
- package/dist/tools/oc-gate-inspect.d.ts.map +1 -0
- package/dist/tools/oc-gate-inspect.js +145 -0
- package/dist/tools/oc-gate-inspect.js.map +1 -0
- package/dist/tools/oc-journal-compact.d.ts +25 -0
- package/dist/tools/oc-journal-compact.d.ts.map +1 -0
- package/dist/tools/oc-journal-compact.js +211 -0
- package/dist/tools/oc-journal-compact.js.map +1 -0
- package/dist/tools/oc-lane.d.ts.map +1 -1
- package/dist/tools/oc-lane.js +18 -1
- package/dist/tools/oc-lane.js.map +1 -1
- package/dist/tools/oc-skill-export.js +1 -1
- package/dist/tools/oc-skill-export.js.map +1 -1
- package/dist/tools/oc-skill-recall.d.ts +24 -2
- package/dist/tools/oc-skill-recall.d.ts.map +1 -1
- package/dist/tools/oc-skill-recall.js +105 -7
- package/dist/tools/oc-skill-recall.js.map +1 -1
- package/dist/tools/oc-skill-record.d.ts +7 -0
- package/dist/tools/oc-skill-record.d.ts.map +1 -1
- package/dist/tools/oc-skill-record.js +54 -0
- package/dist/tools/oc-skill-record.js.map +1 -1
- package/dist/tools/read-page.d.ts.map +1 -1
- package/dist/tools/read-page.js +3 -0
- package/dist/tools/read-page.js.map +1 -1
- package/dist/tools/session-resume.d.ts +4 -0
- package/dist/tools/session-resume.d.ts.map +1 -1
- package/dist/tools/session-resume.js +60 -0
- package/dist/tools/session-resume.js.map +1 -1
- package/dist/tools/shutdown.d.ts.map +1 -1
- package/dist/tools/shutdown.js +5 -2
- package/dist/tools/shutdown.js.map +1 -1
- package/dist/transports/broker-proxy.d.ts +28 -0
- package/dist/transports/broker-proxy.d.ts.map +1 -0
- package/dist/transports/broker-proxy.js +162 -0
- package/dist/transports/broker-proxy.js.map +1 -0
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +17 -4
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js.map +1 -1
- package/dist/types/browser-backend.d.ts +19 -0
- package/dist/types/browser-backend.d.ts.map +1 -1
- package/dist/types/tool-annotations.d.ts +3 -0
- package/dist/types/tool-annotations.d.ts.map +1 -1
- package/dist/types/tool-annotations.js +3 -0
- package/dist/types/tool-annotations.js.map +1 -1
- package/dist/utils/controller-lock.d.ts +41 -0
- package/dist/utils/controller-lock.d.ts.map +1 -0
- package/dist/utils/controller-lock.js +205 -0
- package/dist/utils/controller-lock.js.map +1 -0
- package/dist/utils/duplicate-controller-diagnostics.d.ts +55 -0
- package/dist/utils/duplicate-controller-diagnostics.d.ts.map +1 -0
- package/dist/utils/duplicate-controller-diagnostics.js +227 -0
- package/dist/utils/duplicate-controller-diagnostics.js.map +1 -0
- package/dist/watchdog/health-endpoint.d.ts +8 -0
- package/dist/watchdog/health-endpoint.d.ts.map +1 -1
- package/dist/watchdog/health-endpoint.js.map +1 -1
- package/package.json +3 -1
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
|
-
|
|
40
|
+
실시간 페이지 · 이미 인증됨 · 봇 탐지 우회
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
| | 기존 방식 (Playwright 등) | OpenChrome |
|
|
44
44
|
|---|:---:|:---:|
|
|
45
|
-
| 5개 사이트
|
|
46
|
-
|
|
|
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
|
-
걸쳐
|
|
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
|
-
|
|
184
|
-
비용
|
|
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
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
186
|
-
|
|
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
|
|
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 |
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,oDAEC;AAED,sDAEC;AAMD,kDAYC;AAED,sDAMC;AAED,gDASC;AAED,oDAKC;AA9ED,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,wCAAwC;AACxC,8DAA6F;AAwB7F,SAAgB,oBAAoB,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B;IACvF,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY,EAAE,WAAmB,EAAE,OAAgB;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,GAAG,IAAA,mCAAiB,EAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,SAAgB,mBAAmB,CAAC,QAAwB;IAC1D,MAAM,WAAW,GAAG,IAAA,gDAA8B,EAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzE,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAChC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAA,oBAAU,GAAE;QACzC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzD,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW;QACX,QAAQ,EAAE,UAAU,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,MAAM;QAC/E,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,QAAwB,EAAE,OAAgB;IAC9E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY,EAAE,WAAmB,EAAE,OAAgB;IACpF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAmB,CAAC;QACjF,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3H,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,WAAmB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAgB;IACzG,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG;QAAE,OAAO;IAC7C,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -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":";;AA2BA,gDASC;AAED,sDAYC;AAED,oDAKC;AAED,kDAKC;AAED,0EAEC;AAED,gEAEC;AAED,kEAQC;AArED,MAAM,SAAS,GAA4B;IACzC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,KAAK;CAC/B,CAAC;AAEF,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAChD,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC;IAC1B,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACjF,SAAS,CAAC,uBAAuB,GAAG,OAAO,CAAC;IAC5C,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAA0D;IAC9F,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;IAC/B,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC;IAC5B,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAC7B,SAAS,CAAC,KAAK,GAAG,cAAc,CAAC;IACnC,CAAC;SAAM,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAClE,SAAS,CAAC,cAAc,IAAI,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,KAAK,GAAG,cAAc,CAAC;IACnC,CAAC;IACD,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,oBAAoB;IAClC,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;IAC/B,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC;IAC7B,SAAS,CAAC,SAAS,GAAG,uBAAuB,CAAC;IAC9C,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,mBAAmB;IACjC,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;IAC/B,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,SAAS,GAAG,sBAAsB,CAAC;IAC7C,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,+BAA+B;IAC7C,OAAO,SAAS,CAAC,uBAAuB,CAAC;AAC3C,CAAC;AAED,SAAgB,0BAA0B;IACxC,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,SAAgB,2BAA2B;IACzC,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC;IAC5B,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC;IAC7B,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,uBAAuB,GAAG,KAAK,CAAC;AAC5C,CAAC"}
|
package/dist/cdp/client.d.ts
CHANGED
|
@@ -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
|
package/dist/cdp/client.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/cdp/client.js
CHANGED
|
@@ -1490,41 +1490,11 @@ class CDPClient {
|
|
|
1490
1490
|
]);
|
|
1491
1491
|
}
|
|
1492
1492
|
else {
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
// tries (imperfectly) to clean up.
|
|
1499
|
-
let reused = null;
|
|
1500
|
-
if (this.targetIdIndex.size === 0 && this.getChromeLifecycleMode() === 'isolated') {
|
|
1501
|
-
const candidates = browser.targets().filter(t => {
|
|
1502
|
-
if (t.type() !== 'page')
|
|
1503
|
-
return false;
|
|
1504
|
-
const tid = (0, puppeteer_helpers_1.getTargetId)(t);
|
|
1505
|
-
return !!tid && !this.targetIdIndex.has(tid);
|
|
1506
|
-
});
|
|
1507
|
-
if (candidates.length === 1) {
|
|
1508
|
-
const candidateUrl = candidates[0].url();
|
|
1509
|
-
const isStartupBlank = candidateUrl === '' ||
|
|
1510
|
-
candidateUrl === 'about:blank' ||
|
|
1511
|
-
candidateUrl === 'chrome://newtab/' ||
|
|
1512
|
-
candidateUrl.startsWith('chrome://new-tab-page');
|
|
1513
|
-
if (isStartupBlank) {
|
|
1514
|
-
try {
|
|
1515
|
-
reused = await candidates[0].page();
|
|
1516
|
-
}
|
|
1517
|
-
catch {
|
|
1518
|
-
reused = null;
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
}
|
|
1522
|
-
}
|
|
1523
|
-
if (reused) {
|
|
1524
|
-
page = reused;
|
|
1525
|
-
console.error(`[CDPClient] Reused startup NTP target ${(0, puppeteer_helpers_1.getTargetId)(reused.target())} for first createPage (URL: ${reused.url()})`);
|
|
1526
|
-
// Skip cookie bridge on reuse: this is the very first managed page on
|
|
1527
|
-
// this Chrome, so there are no authenticated source tabs to copy from.
|
|
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`);
|
|
1528
1498
|
}
|
|
1529
1499
|
else {
|
|
1530
1500
|
// Create page in Chrome's default context
|
|
@@ -1535,30 +1505,30 @@ class CDPClient {
|
|
|
1535
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);
|
|
1536
1506
|
}),
|
|
1537
1507
|
]);
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
}
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
})
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
}
|
|
1508
|
+
}
|
|
1509
|
+
// Copy cookies from an authenticated page (skip for pool pre-warming to avoid
|
|
1510
|
+
// CDP session conflicts and unnecessary overhead on about:blank pages).
|
|
1511
|
+
// The global skipCookieBridge flag serves as a manual override escape hatch.
|
|
1512
|
+
// Overall timeout prevents cascading hangs from unresponsive source tabs.
|
|
1513
|
+
if (!skipCookieBridge && !(0, global_1.getGlobalConfig)().skipCookieBridge) {
|
|
1514
|
+
const cookieScan = await this.findAuthenticatedPageTarget(targetDomain);
|
|
1515
|
+
if (cookieScan.status === 'partial' && !cookieScan.targetId) {
|
|
1516
|
+
console.error(`[CDPClient] Cookie bridge proceeding without copied cookies: ${cookieScan.warning ?? 'cookie scan incomplete'}`);
|
|
1517
|
+
}
|
|
1518
|
+
if (cookieScan.targetId) {
|
|
1519
|
+
let cookieCopyTid;
|
|
1520
|
+
await Promise.race([
|
|
1521
|
+
this.copyCookiesViaCDP(cookieScan.targetId, page),
|
|
1522
|
+
new Promise((resolve) => {
|
|
1523
|
+
cookieCopyTid = setTimeout(() => {
|
|
1524
|
+
console.error(`[CDPClient] Cookie copy timed out after ${defaults_1.DEFAULT_COOKIE_COPY_TIMEOUT_MS}ms, proceeding without cookies`);
|
|
1525
|
+
resolve();
|
|
1526
|
+
}, defaults_1.DEFAULT_COOKIE_COPY_TIMEOUT_MS);
|
|
1527
|
+
}),
|
|
1528
|
+
]).finally(() => {
|
|
1529
|
+
if (cookieCopyTid)
|
|
1530
|
+
clearTimeout(cookieCopyTid);
|
|
1531
|
+
});
|
|
1562
1532
|
}
|
|
1563
1533
|
}
|
|
1564
1534
|
}
|
|
@@ -1588,7 +1558,11 @@ class CDPClient {
|
|
|
1588
1558
|
(0, domain_guard_1.assertDomainAllowed)(page.url());
|
|
1589
1559
|
}
|
|
1590
1560
|
catch (err) {
|
|
1591
|
-
// 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.
|
|
1592
1566
|
const targetId = (0, puppeteer_helpers_1.getTargetId)(page.target());
|
|
1593
1567
|
this.targetIdIndex.delete(targetId);
|
|
1594
1568
|
await page.close().catch(() => { });
|
|
@@ -1597,6 +1571,30 @@ class CDPClient {
|
|
|
1597
1571
|
}
|
|
1598
1572
|
return page;
|
|
1599
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
|
+
}
|
|
1600
1598
|
/**
|
|
1601
1599
|
* Open a new tab via Chrome's HTTP debug API without attaching CDP during load.
|
|
1602
1600
|
* This avoids the Runtime.enable serialization artifacts that Cloudflare Turnstile
|