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.
Files changed (97) hide show
  1. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/PKG-INFO +1 -1
  2. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/__init__.py +132 -145
  3. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/__init__.py +6 -1
  4. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/cdp.py +25 -3
  5. s_librarykit-0.3.1/librarykit/antibot/warmup_minter.py +255 -0
  6. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/entities.py +27 -2
  7. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/__init__.py +1 -1
  8. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/health.py +8 -8
  9. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/pyproject.toml +1 -1
  10. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_orchestration.py +21 -4
  11. s_librarykit-0.3.1/tests/test_warmup_minter.py +319 -0
  12. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/.gitignore +0 -0
  13. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/.gitlab-ci.yml +0 -0
  14. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/AGENTS.md +0 -0
  15. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/CHANGELOG.md +0 -0
  16. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/LICENSE +0 -0
  17. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/README.md +0 -0
  18. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/docs/superpowers/specs/2026-06-24-unified-sessions-design.md +0 -0
  19. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/_helpers.py +0 -0
  20. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/curl_cffi.py +0 -0
  21. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/antibot/page_evaluate.py +0 -0
  22. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/auth.py +0 -0
  23. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/blocks.py +0 -0
  24. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/__init__.py +0 -0
  25. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/_engine.py +0 -0
  26. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/camoufox.py +0 -0
  27. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/geometry.py +0 -0
  28. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/launchers.py +0 -0
  29. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/browser/state.py +0 -0
  30. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/bulk.py +0 -0
  31. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/checkpoint.py +0 -0
  32. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/config_util.py +0 -0
  33. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/contract.py +0 -0
  34. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/enums.py +0 -0
  35. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/errmap.py +0 -0
  36. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/errors.py +0 -0
  37. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/factory.py +0 -0
  38. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/forms.py +0 -0
  39. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/graphql.py +0 -0
  40. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/limit.py +0 -0
  41. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/onboarding.py +0 -0
  42. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/orchestration/session_loader.py +0 -0
  43. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/pagination.py +0 -0
  44. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/pool.py +0 -0
  45. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/ports.py +0 -0
  46. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/protocols.py +0 -0
  47. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/redaction.py +0 -0
  48. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/refresh.py +0 -0
  49. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/retry.py +0 -0
  50. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/rpc.py +0 -0
  51. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/secret_store.py +0 -0
  52. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/session_bridge.py +0 -0
  53. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/session_paths.py +0 -0
  54. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/__init__.py +0 -0
  55. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/_const.py +0 -0
  56. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/sessions/_fsutil.py +0 -0
  57. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/stream.py +0 -0
  58. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/__init__.py +0 -0
  59. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/_helpers.py +0 -0
  60. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/http_client.py +0 -0
  61. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/permissive.py +0 -0
  62. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/rest_client.py +0 -0
  63. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/transport/transport_http.py +0 -0
  64. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/upload.py +0 -0
  65. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/librarykit/windows.py +0 -0
  66. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/conftest.py +0 -0
  67. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_antibot.py +0 -0
  68. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_auth.py +0 -0
  69. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_blocks.py +0 -0
  70. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_browser.py +0 -0
  71. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_bulk.py +0 -0
  72. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_checkpoint.py +0 -0
  73. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_config_util.py +0 -0
  74. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_errmap.py +0 -0
  75. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_errors.py +0 -0
  76. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_factory.py +0 -0
  77. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_forms.py +0 -0
  78. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_graphql.py +0 -0
  79. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_limit.py +0 -0
  80. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_limit_contract.py +0 -0
  81. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_pagination.py +0 -0
  82. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_permissive_http.py +0 -0
  83. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_pool.py +0 -0
  84. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_redaction.py +0 -0
  85. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_refresh.py +0 -0
  86. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_retry.py +0 -0
  87. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_rpc.py +0 -0
  88. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_session_bridge.py +0 -0
  89. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_session_paths.py +0 -0
  90. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_sessions.py +0 -0
  91. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_stream.py +0 -0
  92. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_client.py +0 -0
  93. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_rest.py +0 -0
  94. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_transport_sync.py +0 -0
  95. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_upload.py +0 -0
  96. {s_librarykit-0.2.0 → s_librarykit-0.3.1}/tests/test_windows.py +0 -0
  97. {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.2.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.2.0"
252
+ __version__ = "0.3.1"
248
253
 
249
254
  __all__ = [
250
255
  "__version__",
251
- # checkpoint
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
- "StreamTransport",
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
- "ErrorMapper",
325
- "Paginator",
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
- # transport (W4): конкретный httpx-транспорт + choke-point клиент
352
- "HttpxTransport",
353
- "HttpxRequestExecutor",
354
- "HttpClient",
355
- "RestHttpClient",
356
- # transport sync-сиблинги (для навыков без event-loop)
357
- "HttpxSyncTransport",
358
- "HttpxSyncRequestExecutor",
359
- "SyncHttpClient",
360
- # forms (W8): кодек form-urlencoded тел с nested-JSON полями
361
- "FormCodec",
362
- # graphql (W8): GENERIC GraphQL-клиент поверх RestHttpClient/HttpClient
363
- "GraphQLClient",
364
- # upload (W8): GENERIC resumable chunked uploader
365
- "ChunkedUploader",
366
- "UploadResult",
367
- # blocks (W8): GENERIC draft.js richtext block-хелперы
368
- "blocks",
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
- # pagination (W4): листатель ресурса (offset/cursor/page) tweepy-стиля
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
- # redaction: маски секретов + truncation для HTTP-заголовков/body (audit/логи)
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 — роль «умеет выполнить запрос в браузере» [было CdpBrowserBackend].
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
- """Контракт «движка реального браузера» под `CdpTransport` (точка DI).
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`: движок реального/stealth-браузера БЕЗ await.
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(