s-librarykit 0.2.0__tar.gz → 0.3.1__tar.gz
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.
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/PKG-INFO +1 -1
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/__init__.py +132 -145
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/__init__.py +6 -1
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/cdp.py +25 -3
- s_librarykit-0.3.1/librarykit/antibot/warmup_minter.py +255 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/entities.py +27 -2
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/__init__.py +1 -1
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/health.py +8 -8
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/pyproject.toml +1 -1
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_orchestration.py +21 -4
- s_librarykit-0.3.1/tests/test_warmup_minter.py +319 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/.gitignore +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/.gitlab-ci.yml +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/AGENTS.md +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/CHANGELOG.md +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/LICENSE +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/README.md +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/docs/superpowers/specs/2026-06-24-unified-sessions-design.md +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/_helpers.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/curl_cffi.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/page_evaluate.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/auth.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/blocks.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/__init__.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/_engine.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/camoufox.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/geometry.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/launchers.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/state.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/bulk.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/checkpoint.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/config_util.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/contract.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/enums.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/errmap.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/errors.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/factory.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/forms.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/graphql.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/limit.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/onboarding.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/session_loader.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/pagination.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/pool.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/ports.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/protocols.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/redaction.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/refresh.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/retry.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/rpc.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/secret_store.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/session_bridge.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/session_paths.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/__init__.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/_const.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/_fsutil.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/stream.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/__init__.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/_helpers.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/http_client.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/permissive.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/rest_client.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/transport_http.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/upload.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/windows.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/conftest.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_antibot.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_auth.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_blocks.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_browser.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_bulk.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_checkpoint.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_config_util.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_errmap.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_errors.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_factory.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_forms.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_graphql.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_limit.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_limit_contract.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_pagination.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_permissive_http.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_pool.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_redaction.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_refresh.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_retry.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_rpc.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_session_bridge.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_session_paths.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_sessions.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_stream.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_client.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_rest.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_sync.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_upload.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_windows.py +0 -0
- {s_librarykit-0.2.0 → s_librarykit-0.3.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: s-librarykit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Жирный КОРЕНЬ китов: единая error-иерархия, config/retry/paths-утили, checkpoint/resume, транспорт/auth/sessions — общий код для clikit, adapterkit и доменных пакетов.
|
|
5
5
|
Author: Dmitry
|
|
6
6
|
License: MIT
|
|
@@ -10,6 +10,11 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
# blocks (W8): GENERIC draft.js richtext block-хелперы (текст/заголовок/список).
|
|
12
12
|
from librarykit import blocks
|
|
13
|
+
|
|
14
|
+
# antibot warmup-минт (W4): генерик-«монетный двор» одноразовых токенов тёплой
|
|
15
|
+
# страницей (обобщение chatgpt Sentinel). Механика в ките, семантика (trigger/
|
|
16
|
+
# match) — у сервиса. Тянет только stdlib — реэкспорт наверх безопасен.
|
|
17
|
+
from librarykit.antibot import TokenHarvest, WarmupTokenMinter
|
|
13
18
|
from librarykit.auth import (
|
|
14
19
|
CSRF_DEFAULT_HEADER,
|
|
15
20
|
BrowserLoginAuth,
|
|
@@ -244,158 +249,100 @@ from librarykit.windows import (
|
|
|
244
249
|
parse_window,
|
|
245
250
|
)
|
|
246
251
|
|
|
247
|
-
__version__ = "0.
|
|
252
|
+
__version__ = "0.3.1"
|
|
248
253
|
|
|
249
254
|
__all__ = [
|
|
250
255
|
"__version__",
|
|
251
|
-
#
|
|
252
|
-
"Checkpoint",
|
|
253
|
-
"JsonlSink",
|
|
254
|
-
"RunMetrics",
|
|
255
|
-
# errors (единая иерархия ERROR-HUB)
|
|
256
|
-
"CliError",
|
|
257
|
-
"ApiError",
|
|
258
|
-
"AuthRequired",
|
|
259
|
-
"SessionExpired",
|
|
260
|
-
"RateLimited",
|
|
261
|
-
"ValidationError",
|
|
262
|
-
"NotImplementedYet",
|
|
263
|
-
"NotFoundError",
|
|
264
|
-
"ServerError",
|
|
265
|
-
"TransportError",
|
|
266
|
-
"Blocked",
|
|
267
|
-
"RETRYABLE",
|
|
268
|
-
"AdapterError",
|
|
269
|
-
"NotFound",
|
|
270
|
-
"GraphQLError",
|
|
271
|
-
# config_util / paths
|
|
272
|
-
"deep_merge",
|
|
273
|
-
"interpolate_env",
|
|
274
|
-
"load_dotenv",
|
|
275
|
-
"slugify",
|
|
276
|
-
"normalize_account_id",
|
|
277
|
-
"atomic_write_text",
|
|
278
|
-
"chmod_600",
|
|
279
|
-
"AppPaths",
|
|
280
|
-
# session_paths — единый резолвер браузерных сессий (~/.sessions)
|
|
281
|
-
"sessions_home",
|
|
282
|
-
"browser_profile_dir",
|
|
283
|
-
"shared_google_profile_dir",
|
|
284
|
-
"make_profile_dir_resolver",
|
|
285
|
-
"make_session_store",
|
|
286
|
-
# contract — generic «талия» (Protocol + enums + DTO координат сессии/кредов)
|
|
287
|
-
"PaginationMode",
|
|
288
|
-
"AuthMode",
|
|
256
|
+
# requesting: транспорт-исполнители + режимы/протоколы запроса
|
|
289
257
|
"TransportKind",
|
|
290
258
|
"RequestExecutionMode",
|
|
291
|
-
"SessionRef",
|
|
292
|
-
"Creds",
|
|
293
259
|
"RequestBody",
|
|
294
260
|
"ResponseLike",
|
|
295
261
|
"Transport",
|
|
296
262
|
"SyncTransport",
|
|
297
263
|
"HttpRequestExecutor",
|
|
298
264
|
"SyncHttpRequestExecutor",
|
|
299
|
-
"
|
|
265
|
+
"Codec",
|
|
266
|
+
"make_transport",
|
|
267
|
+
"register_transport",
|
|
268
|
+
"create_request_executor",
|
|
269
|
+
"register_request_provider",
|
|
270
|
+
"HttpxTransport",
|
|
271
|
+
"HttpxRequestExecutor",
|
|
272
|
+
"HttpClient",
|
|
273
|
+
"RestHttpClient",
|
|
274
|
+
"HttpxSyncTransport",
|
|
275
|
+
"HttpxSyncRequestExecutor",
|
|
276
|
+
"SyncHttpClient",
|
|
277
|
+
# browser/сессии: ЖЦ браузер-сессии + профили + warmup-минт
|
|
300
278
|
"BrowserBackend",
|
|
301
279
|
"SyncBrowserBackend",
|
|
302
280
|
"BrowserSession",
|
|
303
281
|
"SyncBrowserSession",
|
|
304
|
-
"Codec",
|
|
305
|
-
"Auth",
|
|
306
|
-
# factory — нейтральный выбор транспорта/браузера по роли (Enum → фабрика → реестр)
|
|
307
282
|
"BrowserEngine",
|
|
308
283
|
"BrowserProvider",
|
|
309
284
|
"AutomationDriver",
|
|
310
285
|
"BrowserOptions",
|
|
311
286
|
"BrowserSessionSettings",
|
|
312
|
-
"make_transport",
|
|
313
|
-
"register_transport",
|
|
314
|
-
"create_request_executor",
|
|
315
|
-
"register_request_provider",
|
|
316
287
|
"make_browser_backend",
|
|
317
288
|
"register_browser_backend",
|
|
318
289
|
"create_browser_session",
|
|
319
290
|
"register_browser_provider",
|
|
291
|
+
"sessions_home",
|
|
292
|
+
"browser_profile_dir",
|
|
293
|
+
"shared_google_profile_dir",
|
|
294
|
+
"make_profile_dir_resolver",
|
|
295
|
+
"make_session_store",
|
|
296
|
+
"WarmupTokenMinter",
|
|
297
|
+
"TokenHarvest",
|
|
298
|
+
# auth + refresh: стратегии авторизации + проактивное обновление сессии
|
|
299
|
+
"AuthMode",
|
|
300
|
+
"Auth",
|
|
320
301
|
"Refreshable",
|
|
321
302
|
"ProactiveRefreshable",
|
|
322
303
|
"SyncRefreshable",
|
|
323
304
|
"SyncProactiveRefreshable",
|
|
324
|
-
"
|
|
325
|
-
"
|
|
305
|
+
"TokenAuth",
|
|
306
|
+
"CookieSessionAuth",
|
|
307
|
+
"OAuth2Auth",
|
|
308
|
+
"BrowserLoginAuth",
|
|
309
|
+
"CsrfHeaderAuth",
|
|
310
|
+
"CSRF_DEFAULT_HEADER",
|
|
311
|
+
"extract_token_from_text",
|
|
312
|
+
"dump_settings",
|
|
313
|
+
"load_settings",
|
|
314
|
+
"encrypt_settings",
|
|
315
|
+
"decrypt_settings",
|
|
316
|
+
"RotatingAuth",
|
|
317
|
+
"Keepalive",
|
|
318
|
+
"RefreshableChain",
|
|
319
|
+
"DEFAULT_ROTATE_INTERVAL",
|
|
320
|
+
# sessions + secrets: envelope-хранилище сессий + креды + keyring-стор
|
|
321
|
+
"SessionRef",
|
|
322
|
+
"Creds",
|
|
326
323
|
"SessionStoreProtocol",
|
|
327
|
-
# contract — квоты/лимиты (generic DTO)
|
|
328
|
-
"QuotaScope",
|
|
329
|
-
"QuotaInfo",
|
|
330
|
-
"LimitSpec",
|
|
331
|
-
# protocols — онбординг/health контракты (опциональные)
|
|
332
|
-
"LoginMode",
|
|
333
|
-
"LoginRequirements",
|
|
334
|
-
"InteractiveFlow",
|
|
335
|
-
"OnboardingProtocol",
|
|
336
|
-
"HealthState",
|
|
337
|
-
"HealthStatus",
|
|
338
|
-
"HealthProtocol",
|
|
339
|
-
# entities (W6) — нейтральные data-классы оркестраторов (почва под W7)
|
|
340
|
-
"Session",
|
|
341
|
-
"SessionChanges",
|
|
342
|
-
"SessionContext",
|
|
343
|
-
"HealthReport",
|
|
344
|
-
# secret_store — keyring + file-fallback
|
|
345
|
-
"SecretStore",
|
|
346
|
-
# sessions (W4): envelope-шифрованное хранилище сессий (spec §4)
|
|
347
324
|
"SessionStore",
|
|
348
325
|
"SessionStoreError",
|
|
349
326
|
"KekUnavailableError",
|
|
350
327
|
"resolve_kek",
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
"
|
|
354
|
-
"
|
|
355
|
-
"
|
|
356
|
-
|
|
357
|
-
"
|
|
358
|
-
"
|
|
359
|
-
"
|
|
360
|
-
|
|
361
|
-
"
|
|
362
|
-
|
|
363
|
-
"
|
|
364
|
-
|
|
365
|
-
"
|
|
366
|
-
"
|
|
367
|
-
|
|
368
|
-
"
|
|
369
|
-
"text_block",
|
|
370
|
-
"block_end",
|
|
371
|
-
"header_block",
|
|
372
|
-
"list_item_block",
|
|
373
|
-
"paragraphs",
|
|
374
|
-
"decode_text_block",
|
|
375
|
-
# limit: проактивный конфигуратор троттлинга / rate-limit по scope
|
|
376
|
-
"LimitWindow",
|
|
377
|
-
"LimitPolicy",
|
|
378
|
-
"LimitScope",
|
|
379
|
-
"RateLimiter",
|
|
380
|
-
# windows: обобщённые ОКНА лимитов (rolling/calendar/fixed) + фабрика
|
|
381
|
-
"Window",
|
|
382
|
-
"RollingWindow",
|
|
383
|
-
"CalendarWindow",
|
|
384
|
-
"FixedWindow",
|
|
385
|
-
"parse_window",
|
|
386
|
-
# pool: балансер N аккаунтов одного сервиса (селектор поверх SessionStore)
|
|
387
|
-
"SessionPool",
|
|
388
|
-
"PoolChoice",
|
|
389
|
-
"DEFAULT_SKIP_STATUSES",
|
|
390
|
-
# rpc (E1): codec-слой + RPC choke-point поверх HttpClient
|
|
391
|
-
"JsonCodec",
|
|
392
|
-
"PrefixedJsonCodec",
|
|
393
|
-
"RpcClient",
|
|
394
|
-
# stream (E1): WS-подобные persistent-транспорты (Stub + websockets reference)
|
|
395
|
-
"StubStreamTransport",
|
|
396
|
-
"WebSocketsStreamTransport",
|
|
397
|
-
"StreamClosedError",
|
|
398
|
-
# errmap (W4): декларативная карта HTTP-ответ → доменная ошибка
|
|
328
|
+
"SecretStore",
|
|
329
|
+
# errors + errmap: единая иерархия ERROR-HUB + карта ответ→ошибка
|
|
330
|
+
"CliError",
|
|
331
|
+
"ApiError",
|
|
332
|
+
"AuthRequired",
|
|
333
|
+
"SessionExpired",
|
|
334
|
+
"RateLimited",
|
|
335
|
+
"ValidationError",
|
|
336
|
+
"NotImplementedYet",
|
|
337
|
+
"NotFoundError",
|
|
338
|
+
"ServerError",
|
|
339
|
+
"TransportError",
|
|
340
|
+
"Blocked",
|
|
341
|
+
"RETRYABLE",
|
|
342
|
+
"AdapterError",
|
|
343
|
+
"NotFound",
|
|
344
|
+
"GraphQLError",
|
|
345
|
+
"ErrorMapper",
|
|
399
346
|
"ErrorMap",
|
|
400
347
|
"ErrorMapBuilder",
|
|
401
348
|
"BodyRule",
|
|
@@ -403,7 +350,27 @@ __all__ = [
|
|
|
403
350
|
"AuthExpired",
|
|
404
351
|
"build_error_map",
|
|
405
352
|
"DEFAULT_ERROR_MAP",
|
|
406
|
-
#
|
|
353
|
+
# reliability: retry / limit / pool / checkpoint
|
|
354
|
+
"RetryPolicy",
|
|
355
|
+
"DEFAULT_RETRY",
|
|
356
|
+
"SimpleRetryPolicy",
|
|
357
|
+
"DEFAULT_SIMPLE_RETRY",
|
|
358
|
+
"LimitWindow",
|
|
359
|
+
"LimitPolicy",
|
|
360
|
+
"LimitScope",
|
|
361
|
+
"RateLimiter",
|
|
362
|
+
"LimitSpec",
|
|
363
|
+
"QuotaScope",
|
|
364
|
+
"QuotaInfo",
|
|
365
|
+
"SessionPool",
|
|
366
|
+
"PoolChoice",
|
|
367
|
+
"DEFAULT_SKIP_STATUSES",
|
|
368
|
+
"Checkpoint",
|
|
369
|
+
"JsonlSink",
|
|
370
|
+
"RunMetrics",
|
|
371
|
+
# pagination / bulk / upload: листание ресурса + батчи + resumable-догрузка
|
|
372
|
+
"PaginationMode",
|
|
373
|
+
"Paginator",
|
|
407
374
|
"CursorPaginator",
|
|
408
375
|
"PageParams",
|
|
409
376
|
"DEFAULT_PAGE_PARAMS",
|
|
@@ -412,40 +379,52 @@ __all__ = [
|
|
|
412
379
|
"default_extract_items",
|
|
413
380
|
"default_extract_cursor",
|
|
414
381
|
"with_page_params",
|
|
415
|
-
# pagination flat-page (W8): offset/total на верхнем уровне тела
|
|
416
382
|
"FlatPage",
|
|
417
383
|
"parse_flat_page",
|
|
418
384
|
"next_flat_offset",
|
|
419
|
-
# auth (W4): стратегии авторизации + персистентность сессии
|
|
420
|
-
"TokenAuth",
|
|
421
|
-
"CookieSessionAuth",
|
|
422
|
-
"OAuth2Auth",
|
|
423
|
-
"BrowserLoginAuth",
|
|
424
|
-
"CsrfHeaderAuth",
|
|
425
|
-
"CSRF_DEFAULT_HEADER",
|
|
426
|
-
"extract_token_from_text",
|
|
427
|
-
"dump_settings",
|
|
428
|
-
"load_settings",
|
|
429
|
-
"encrypt_settings",
|
|
430
|
-
"decrypt_settings",
|
|
431
|
-
# refresh: проактивное обновление ротируемой сессии + keepalive + fallback
|
|
432
|
-
"RotatingAuth",
|
|
433
|
-
"Keepalive",
|
|
434
|
-
"RefreshableChain",
|
|
435
|
-
"DEFAULT_ROTATE_INTERVAL",
|
|
436
|
-
# retry
|
|
437
|
-
"RetryPolicy",
|
|
438
|
-
"DEFAULT_RETRY",
|
|
439
|
-
"SimpleRetryPolicy",
|
|
440
|
-
"DEFAULT_SIMPLE_RETRY",
|
|
441
|
-
# bulk: движок батч-операций над набором id (per-item outcome, не роняет батч)
|
|
442
385
|
"BulkOutcome",
|
|
443
386
|
"BulkOperationError",
|
|
444
387
|
"BulkError",
|
|
445
388
|
"BulkOperationResult",
|
|
446
389
|
"run_bulk",
|
|
447
390
|
"run_bulk_async",
|
|
448
|
-
|
|
391
|
+
"ChunkedUploader",
|
|
392
|
+
"UploadResult",
|
|
393
|
+
# orchestration / protocols / entities: онбординг/health + нейтральные data-классы
|
|
394
|
+
"LoginMode",
|
|
395
|
+
"LoginRequirements",
|
|
396
|
+
"InteractiveFlow",
|
|
397
|
+
"OnboardingProtocol",
|
|
398
|
+
"HealthState",
|
|
399
|
+
"HealthStatus",
|
|
400
|
+
"HealthProtocol",
|
|
401
|
+
"Session",
|
|
402
|
+
"SessionChanges",
|
|
403
|
+
"SessionContext",
|
|
404
|
+
"HealthReport",
|
|
405
|
+
# rpc / stream / graphql: codec-слой + persistent-транспорты + GraphQL-клиент
|
|
406
|
+
"StreamTransport",
|
|
407
|
+
"JsonCodec",
|
|
408
|
+
"PrefixedJsonCodec",
|
|
409
|
+
"RpcClient",
|
|
410
|
+
"StubStreamTransport",
|
|
411
|
+
"WebSocketsStreamTransport",
|
|
412
|
+
"StreamClosedError",
|
|
413
|
+
"GraphQLClient",
|
|
414
|
+
# blocks / forms / windows / redaction / config: примитивы тел, окна, маски, утили путей
|
|
415
|
+
"blocks",
|
|
416
|
+
"text_block",
|
|
417
|
+
"block_end",
|
|
418
|
+
"header_block",
|
|
419
|
+
"list_item_block",
|
|
420
|
+
"paragraphs",
|
|
421
|
+
"decode_text_block",
|
|
422
|
+
"FormCodec",
|
|
423
|
+
"Window",
|
|
424
|
+
"RollingWindow",
|
|
425
|
+
"CalendarWindow",
|
|
426
|
+
"FixedWindow",
|
|
427
|
+
"parse_window",
|
|
449
428
|
"SECRET_MASK",
|
|
450
429
|
"HEADER_BLACKLIST",
|
|
451
430
|
"BODY_FIELD_PATTERNS",
|
|
@@ -453,4 +432,12 @@ __all__ = [
|
|
|
453
432
|
"sanitize_body",
|
|
454
433
|
"truncate_body",
|
|
455
434
|
"excerpt_response_body",
|
|
435
|
+
"deep_merge",
|
|
436
|
+
"interpolate_env",
|
|
437
|
+
"load_dotenv",
|
|
438
|
+
"slugify",
|
|
439
|
+
"normalize_account_id",
|
|
440
|
+
"atomic_write_text",
|
|
441
|
+
"chmod_600",
|
|
442
|
+
"AppPaths",
|
|
456
443
|
]
|
|
@@ -91,12 +91,14 @@ from .page_evaluate import (
|
|
|
91
91
|
page_fetch,
|
|
92
92
|
sync_page_fetch,
|
|
93
93
|
)
|
|
94
|
+
from .warmup_minter import TokenHarvest, WarmupTokenMinter
|
|
94
95
|
|
|
95
96
|
# Первичные ролевые имена исполнителей запроса (роль снаружи, вендор — внутри):
|
|
96
97
|
# ImpersonatedHttpExecutor — TLS/JA3-impersonate (curl-cffi) [было CurlCffiTransport];
|
|
97
98
|
# BrowserRequestExecutor — запрос «руками браузера» по CDP/CamouFox [было CdpTransport];
|
|
98
99
|
# BorrowedPageRequestExecutor — запрос в ЗАИМСТВОВАННОЙ странице [было PageEvaluateTransport];
|
|
99
|
-
# BrowserRequester — роль «умеет выполнить запрос в браузере»
|
|
100
|
+
# BrowserRequester — роль «умеет выполнить запрос в браузере» ПОВЕРХ живой
|
|
101
|
+
# contract.BrowserSession (fetch, не ЖЦ) [было CdpBrowserBackend].
|
|
100
102
|
# Старые имена остаются deprecated-псевдонимами (ничего не удалено).
|
|
101
103
|
ImpersonatedHttpExecutor = CurlCffiTransport
|
|
102
104
|
BrowserRequestExecutor = CdpTransport
|
|
@@ -116,6 +118,9 @@ __all__ = [
|
|
|
116
118
|
"page_fetch",
|
|
117
119
|
"sync_page_fetch",
|
|
118
120
|
"pick_chrome_impersonate",
|
|
121
|
+
# warmup-минт одноразовых токенов тёплой страницей (генерик chatgpt-паттерна)
|
|
122
|
+
"WarmupTokenMinter",
|
|
123
|
+
"TokenHarvest",
|
|
119
124
|
# первичные ролевые имена (псевдонимы вендор-классов выше)
|
|
120
125
|
"ImpersonatedHttpExecutor",
|
|
121
126
|
"BrowserRequestExecutor",
|
|
@@ -23,12 +23,28 @@ from ._helpers import _as_transport_error, _to_httpx_response
|
|
|
23
23
|
|
|
24
24
|
@runtime_checkable
|
|
25
25
|
class CdpBrowserBackend(Protocol):
|
|
26
|
-
"""Контракт
|
|
26
|
+
"""Контракт «умеет ВЫПОЛНИТЬ запрос в браузере» (роль `BrowserRequester`), под
|
|
27
|
+
`CdpTransport` (точка DI).
|
|
27
28
|
|
|
28
29
|
Скрывает за собой запуск системного Edge/Chrome с `--remote-debugging-port`
|
|
29
30
|
и `connect_over_cdp` (см. recipes/antibot `cdp_real_browser.py`). Реализация —
|
|
30
31
|
в `librarykit.browser` (Playwright/patchright); здесь — только контракт, чтобы
|
|
31
32
|
`antibot` не тащил тяжёлый browser-стек и тестировался фейком той же формы.
|
|
33
|
+
|
|
34
|
+
Разделение с `librarykit.contract.BrowserSession` (= `BrowserBackend`) — это
|
|
35
|
+
ДВЕ РАЗНЫЕ роли, а не одна:
|
|
36
|
+
|
|
37
|
+
- `BrowserSession` — ЖИЗНЕННЫЙ ЦИКЛ живой сессии: поднять/держать/закрыть
|
|
38
|
+
браузер и отдать страницу с контекстом (`ensure_page`/`context`/`aclose`);
|
|
39
|
+
- `CdpBrowserBackend` (`BrowserRequester`) — СПОСОБНОСТЬ выполнить HTTP-запрос
|
|
40
|
+
руками уже живой сессии (`fetch`), поверх её страницы/контекста.
|
|
41
|
+
|
|
42
|
+
Как Protocol'ы они пересекаются лишь по `aclose()`; ни один не является
|
|
43
|
+
структурным подтипом другого (у Requester нет `ensure_page`/`context`, у
|
|
44
|
+
Session нет `fetch`). Конкретные бэкенды `librarykit.browser`
|
|
45
|
+
(`CdpChromeBackend`/`CamoufoxBackend`) реализуют ОБА контракта одним объектом:
|
|
46
|
+
он И держит живую сессию, И умеет `fetch` поверх неё — то есть
|
|
47
|
+
`BrowserRequester` НАДСТРАИВАЕТ исполнение запроса над сессией, не заменяя её.
|
|
32
48
|
"""
|
|
33
49
|
|
|
34
50
|
async def fetch(
|
|
@@ -174,11 +190,17 @@ class CdpTransport(Transport):
|
|
|
174
190
|
|
|
175
191
|
@runtime_checkable
|
|
176
192
|
class SyncCdpBrowserBackend(Protocol):
|
|
177
|
-
"""Sync-сиблинг `CdpBrowserBackend`:
|
|
193
|
+
"""Sync-сиблинг `CdpBrowserBackend`: роль `SyncBrowserRequester` БЕЗ await.
|
|
178
194
|
|
|
179
|
-
Та же роль
|
|
195
|
+
Та же роль «умеет ВЫПОЛНИТЬ запрос в браузере» (`fetch` → ответоподобный
|
|
180
196
|
объект под `_to_httpx_response`), но синхронная сигнатура — для навыков без
|
|
181
197
|
event-loop. Реализация — `librarykit.browser.SyncCamoufoxBackend`.
|
|
198
|
+
|
|
199
|
+
То же разделение, что у async-версии: это СПОСОБНОСТЬ исполнить запрос поверх
|
|
200
|
+
живой сессии, а не её жизненный цикл — ЖЦ (поднять/держать/закрыть, страница+
|
|
201
|
+
контекст) несёт `librarykit.contract.SyncBrowserSession` (= `SyncBrowserBackend`,
|
|
202
|
+
`ensure_page`/`context`). Пересечение Protocol'ов — только семантика закрытия;
|
|
203
|
+
конкретный sync-бэкенд реализует обе роли одним объектом.
|
|
182
204
|
"""
|
|
183
205
|
|
|
184
206
|
def fetch(
|