@lhremote/core 0.8.0 → 0.10.0
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/dist/cdp/app-discovery.d.ts +57 -0
- package/dist/cdp/app-discovery.d.ts.map +1 -1
- package/dist/cdp/app-discovery.js +90 -7
- package/dist/cdp/app-discovery.js.map +1 -1
- package/dist/cdp/app-discovery.test.js +180 -9
- package/dist/cdp/app-discovery.test.js.map +1 -1
- package/dist/cdp/client.d.ts +8 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +8 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/discovery.d.ts.map +1 -1
- package/dist/cdp/discovery.js +5 -1
- package/dist/cdp/discovery.js.map +1 -1
- package/dist/cdp/discovery.test.js +7 -0
- package/dist/cdp/discovery.test.js.map +1 -1
- package/dist/cdp/index.d.ts +1 -1
- package/dist/cdp/index.d.ts.map +1 -1
- package/dist/cdp/index.js +1 -1
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/instance-discovery.d.ts.map +1 -1
- package/dist/cdp/instance-discovery.js +25 -10
- package/dist/cdp/instance-discovery.js.map +1 -1
- package/dist/cdp/instance-discovery.test.js +17 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -1
- package/dist/cdp/testing/launch-chromium.d.ts +1 -1
- package/dist/cdp/testing/launch-chromium.js +2 -2
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +3 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/repositories/campaign-hard-delete.integration.test.js +4 -1
- package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -1
- package/dist/db/repositories/campaign.d.ts.map +1 -1
- package/dist/db/repositories/campaign.js +81 -33
- package/dist/db/repositories/campaign.js.map +1 -1
- package/dist/db/repositories/campaign.test.js +2 -2
- package/dist/db/repositories/collection-list.d.ts +11 -0
- package/dist/db/repositories/collection-list.d.ts.map +1 -1
- package/dist/db/repositories/collection-list.integration.test.js +6 -4
- package/dist/db/repositories/collection-list.integration.test.js.map +1 -1
- package/dist/db/repositories/collection-list.js +92 -2
- package/dist/db/repositories/collection-list.js.map +1 -1
- package/dist/db/testing/create-fixture.js +36 -2
- package/dist/db/testing/create-fixture.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/linkedin/dom-automation-retry.test.d.ts +2 -0
- package/dist/linkedin/dom-automation-retry.test.d.ts.map +1 -0
- package/dist/linkedin/dom-automation-retry.test.js +51 -0
- package/dist/linkedin/dom-automation-retry.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +166 -6
- package/dist/linkedin/dom-automation.d.ts.map +1 -1
- package/dist/linkedin/dom-automation.js +496 -21
- package/dist/linkedin/dom-automation.js.map +1 -1
- package/dist/linkedin/humanized-mouse.d.ts +69 -0
- package/dist/linkedin/humanized-mouse.d.ts.map +1 -0
- package/dist/linkedin/humanized-mouse.js +109 -0
- package/dist/linkedin/humanized-mouse.js.map +1 -0
- package/dist/linkedin/index.d.ts +3 -2
- package/dist/linkedin/index.d.ts.map +1 -1
- package/dist/linkedin/index.js +3 -2
- package/dist/linkedin/index.js.map +1 -1
- package/dist/linkedin/selectors.d.ts +74 -48
- package/dist/linkedin/selectors.d.ts.map +1 -1
- package/dist/linkedin/selectors.js +64 -41
- package/dist/linkedin/selectors.js.map +1 -1
- package/dist/operations/add-people-to-collection.d.ts +1 -1
- package/dist/operations/add-people-to-collection.d.ts.map +1 -1
- package/dist/operations/add-people-to-collection.js +3 -6
- package/dist/operations/add-people-to-collection.js.map +1 -1
- package/dist/operations/build-linkedin-url.test.d.ts +2 -0
- package/dist/operations/build-linkedin-url.test.d.ts.map +1 -0
- package/dist/operations/build-linkedin-url.test.js +158 -0
- package/dist/operations/build-linkedin-url.test.js.map +1 -0
- package/dist/operations/campaign-add-action.d.ts +1 -1
- package/dist/operations/campaign-add-action.d.ts.map +1 -1
- package/dist/operations/campaign-add-action.js +3 -6
- package/dist/operations/campaign-add-action.js.map +1 -1
- package/dist/operations/campaign-create.d.ts +1 -1
- package/dist/operations/campaign-create.d.ts.map +1 -1
- package/dist/operations/campaign-create.js +3 -6
- package/dist/operations/campaign-create.js.map +1 -1
- package/dist/operations/campaign-delete.d.ts +1 -1
- package/dist/operations/campaign-delete.d.ts.map +1 -1
- package/dist/operations/campaign-delete.js +3 -6
- package/dist/operations/campaign-delete.js.map +1 -1
- package/dist/operations/campaign-erase.d.ts +1 -1
- package/dist/operations/campaign-erase.d.ts.map +1 -1
- package/dist/operations/campaign-erase.js +3 -6
- package/dist/operations/campaign-erase.js.map +1 -1
- package/dist/operations/campaign-exclude-add.d.ts +1 -1
- package/dist/operations/campaign-exclude-add.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-add.js +3 -6
- package/dist/operations/campaign-exclude-add.js.map +1 -1
- package/dist/operations/campaign-exclude-list.d.ts +1 -1
- package/dist/operations/campaign-exclude-list.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-list.js +3 -6
- package/dist/operations/campaign-exclude-list.js.map +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-remove.js +3 -6
- package/dist/operations/campaign-exclude-remove.js.map +1 -1
- package/dist/operations/campaign-export.d.ts +1 -1
- package/dist/operations/campaign-export.d.ts.map +1 -1
- package/dist/operations/campaign-export.js +3 -6
- package/dist/operations/campaign-export.js.map +1 -1
- package/dist/operations/campaign-get.d.ts +1 -1
- package/dist/operations/campaign-get.d.ts.map +1 -1
- package/dist/operations/campaign-get.js +3 -6
- package/dist/operations/campaign-get.js.map +1 -1
- package/dist/operations/campaign-list-people.d.ts +1 -1
- package/dist/operations/campaign-list-people.d.ts.map +1 -1
- package/dist/operations/campaign-list-people.js +3 -6
- package/dist/operations/campaign-list-people.js.map +1 -1
- package/dist/operations/campaign-list.d.ts +1 -1
- package/dist/operations/campaign-list.d.ts.map +1 -1
- package/dist/operations/campaign-list.js +3 -6
- package/dist/operations/campaign-list.js.map +1 -1
- package/dist/operations/campaign-move-next.d.ts +1 -1
- package/dist/operations/campaign-move-next.d.ts.map +1 -1
- package/dist/operations/campaign-move-next.js +3 -6
- package/dist/operations/campaign-move-next.js.map +1 -1
- package/dist/operations/campaign-remove-action.d.ts +1 -1
- package/dist/operations/campaign-remove-action.d.ts.map +1 -1
- package/dist/operations/campaign-remove-action.js +3 -6
- package/dist/operations/campaign-remove-action.js.map +1 -1
- package/dist/operations/campaign-remove-people.d.ts +1 -1
- package/dist/operations/campaign-remove-people.d.ts.map +1 -1
- package/dist/operations/campaign-remove-people.js +3 -6
- package/dist/operations/campaign-remove-people.js.map +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts.map +1 -1
- package/dist/operations/campaign-reorder-actions.js +3 -6
- package/dist/operations/campaign-reorder-actions.js.map +1 -1
- package/dist/operations/campaign-retry.d.ts +1 -1
- package/dist/operations/campaign-retry.d.ts.map +1 -1
- package/dist/operations/campaign-retry.js +3 -6
- package/dist/operations/campaign-retry.js.map +1 -1
- package/dist/operations/campaign-start.d.ts +1 -1
- package/dist/operations/campaign-start.d.ts.map +1 -1
- package/dist/operations/campaign-start.js +3 -6
- package/dist/operations/campaign-start.js.map +1 -1
- package/dist/operations/campaign-statistics.d.ts +1 -1
- package/dist/operations/campaign-statistics.d.ts.map +1 -1
- package/dist/operations/campaign-statistics.js +3 -6
- package/dist/operations/campaign-statistics.js.map +1 -1
- package/dist/operations/campaign-status.d.ts +1 -1
- package/dist/operations/campaign-status.d.ts.map +1 -1
- package/dist/operations/campaign-status.js +3 -6
- package/dist/operations/campaign-status.js.map +1 -1
- package/dist/operations/campaign-stop.d.ts +1 -1
- package/dist/operations/campaign-stop.d.ts.map +1 -1
- package/dist/operations/campaign-stop.js +3 -6
- package/dist/operations/campaign-stop.js.map +1 -1
- package/dist/operations/campaign-update-action.d.ts +1 -1
- package/dist/operations/campaign-update-action.d.ts.map +1 -1
- package/dist/operations/campaign-update-action.js +3 -6
- package/dist/operations/campaign-update-action.js.map +1 -1
- package/dist/operations/campaign-update.d.ts +1 -1
- package/dist/operations/campaign-update.d.ts.map +1 -1
- package/dist/operations/campaign-update.js +3 -6
- package/dist/operations/campaign-update.js.map +1 -1
- package/dist/operations/check-replies.d.ts +3 -1
- package/dist/operations/check-replies.d.ts.map +1 -1
- package/dist/operations/check-replies.js +124 -17
- package/dist/operations/check-replies.js.map +1 -1
- package/dist/operations/check-replies.test.js +152 -17
- package/dist/operations/check-replies.test.js.map +1 -1
- package/dist/operations/collect-people.d.ts +1 -1
- package/dist/operations/collect-people.d.ts.map +1 -1
- package/dist/operations/collect-people.js +18 -12
- package/dist/operations/collect-people.js.map +1 -1
- package/dist/operations/collect-people.test.js +21 -5
- package/dist/operations/collect-people.test.js.map +1 -1
- package/dist/operations/comment-on-post.d.ts +4 -1
- package/dist/operations/comment-on-post.d.ts.map +1 -1
- package/dist/operations/comment-on-post.js +15 -19
- package/dist/operations/comment-on-post.js.map +1 -1
- package/dist/operations/comment-on-post.test.js +8 -6
- package/dist/operations/comment-on-post.test.js.map +1 -1
- package/dist/operations/create-collection.d.ts +1 -1
- package/dist/operations/create-collection.d.ts.map +1 -1
- package/dist/operations/create-collection.js +5 -7
- package/dist/operations/create-collection.js.map +1 -1
- package/dist/operations/create-collection.test.js +3 -1
- package/dist/operations/create-collection.test.js.map +1 -1
- package/dist/operations/delete-collection.d.ts +1 -1
- package/dist/operations/delete-collection.d.ts.map +1 -1
- package/dist/operations/delete-collection.js +3 -6
- package/dist/operations/delete-collection.js.map +1 -1
- package/dist/operations/dismiss-errors.d.ts +11 -5
- package/dist/operations/dismiss-errors.d.ts.map +1 -1
- package/dist/operations/dismiss-errors.js +68 -34
- package/dist/operations/dismiss-errors.js.map +1 -1
- package/dist/operations/dismiss-errors.test.js +129 -8
- package/dist/operations/dismiss-errors.test.js.map +1 -1
- package/dist/operations/endorse-skills.test.d.ts +2 -0
- package/dist/operations/endorse-skills.test.d.ts.map +1 -0
- package/dist/operations/endorse-skills.test.js +70 -0
- package/dist/operations/endorse-skills.test.js.map +1 -0
- package/dist/operations/enrich-profile.test.d.ts +2 -0
- package/dist/operations/enrich-profile.test.d.ts.map +1 -0
- package/dist/operations/enrich-profile.test.js +73 -0
- package/dist/operations/enrich-profile.test.js.map +1 -0
- package/dist/operations/ephemeral-action.d.ts +2 -1
- package/dist/operations/ephemeral-action.d.ts.map +1 -1
- package/dist/operations/ephemeral-action.js +5 -7
- package/dist/operations/ephemeral-action.js.map +1 -1
- package/dist/operations/ephemeral-action.test.d.ts +2 -0
- package/dist/operations/ephemeral-action.test.d.ts.map +1 -0
- package/dist/operations/ephemeral-action.test.js +159 -0
- package/dist/operations/ephemeral-action.test.js.map +1 -0
- package/dist/operations/follow-person.test.d.ts +2 -0
- package/dist/operations/follow-person.test.d.ts.map +1 -0
- package/dist/operations/follow-person.test.js +57 -0
- package/dist/operations/follow-person.test.js.map +1 -0
- package/dist/operations/get-action-budget.d.ts +1 -1
- package/dist/operations/get-action-budget.d.ts.map +1 -1
- package/dist/operations/get-action-budget.js +3 -6
- package/dist/operations/get-action-budget.js.map +1 -1
- package/dist/operations/get-errors.d.ts +5 -1
- package/dist/operations/get-errors.d.ts.map +1 -1
- package/dist/operations/get-errors.js +55 -33
- package/dist/operations/get-errors.js.map +1 -1
- package/dist/operations/get-errors.test.js +54 -55
- package/dist/operations/get-errors.test.js.map +1 -1
- package/dist/operations/get-feed.d.ts +83 -4
- package/dist/operations/get-feed.d.ts.map +1 -1
- package/dist/operations/get-feed.js +400 -153
- package/dist/operations/get-feed.js.map +1 -1
- package/dist/operations/get-feed.test.js +416 -190
- package/dist/operations/get-feed.test.js.map +1 -1
- package/dist/operations/get-post-engagers.d.ts +6 -3
- package/dist/operations/get-post-engagers.d.ts.map +1 -1
- package/dist/operations/get-post-engagers.js +278 -78
- package/dist/operations/get-post-engagers.js.map +1 -1
- package/dist/operations/get-post-engagers.test.js +292 -14
- package/dist/operations/get-post-engagers.test.js.map +1 -1
- package/dist/operations/get-post-stats.d.ts +8 -3
- package/dist/operations/get-post-stats.d.ts.map +1 -1
- package/dist/operations/get-post-stats.js +101 -37
- package/dist/operations/get-post-stats.js.map +1 -1
- package/dist/operations/get-post-stats.test.js +137 -2
- package/dist/operations/get-post-stats.test.js.map +1 -1
- package/dist/operations/get-post.d.ts +9 -150
- package/dist/operations/get-post.d.ts.map +1 -1
- package/dist/operations/get-post.js +356 -210
- package/dist/operations/get-post.js.map +1 -1
- package/dist/operations/get-post.test.js +210 -387
- package/dist/operations/get-post.test.js.map +1 -1
- package/dist/operations/get-profile-activity.d.ts +13 -92
- package/dist/operations/get-profile-activity.d.ts.map +1 -1
- package/dist/operations/get-profile-activity.js +305 -105
- package/dist/operations/get-profile-activity.js.map +1 -1
- package/dist/operations/get-profile-activity.test.js +277 -158
- package/dist/operations/get-profile-activity.test.js.map +1 -1
- package/dist/operations/get-throttle-status.d.ts +1 -1
- package/dist/operations/get-throttle-status.d.ts.map +1 -1
- package/dist/operations/get-throttle-status.js +4 -10
- package/dist/operations/get-throttle-status.js.map +1 -1
- package/dist/operations/import-people-from-collection.d.ts +1 -1
- package/dist/operations/import-people-from-collection.d.ts.map +1 -1
- package/dist/operations/import-people-from-collection.js +3 -6
- package/dist/operations/import-people-from-collection.js.map +1 -1
- package/dist/operations/import-people-from-urls.d.ts +1 -1
- package/dist/operations/import-people-from-urls.d.ts.map +1 -1
- package/dist/operations/import-people-from-urls.js +3 -6
- package/dist/operations/import-people-from-urls.js.map +1 -1
- package/dist/operations/index.d.ts +2 -2
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +2 -1
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/like-person-posts.test.d.ts +2 -0
- package/dist/operations/like-person-posts.test.d.ts.map +1 -0
- package/dist/operations/like-person-posts.test.js +103 -0
- package/dist/operations/like-person-posts.test.js.map +1 -0
- package/dist/operations/list-collections.d.ts +1 -1
- package/dist/operations/list-collections.d.ts.map +1 -1
- package/dist/operations/list-collections.js +3 -6
- package/dist/operations/list-collections.js.map +1 -1
- package/dist/operations/message-person.test.d.ts +2 -0
- package/dist/operations/message-person.test.d.ts.map +1 -0
- package/dist/operations/message-person.test.js +108 -0
- package/dist/operations/message-person.test.js.map +1 -0
- package/dist/operations/navigate-away.d.ts +14 -0
- package/dist/operations/navigate-away.d.ts.map +1 -0
- package/dist/operations/navigate-away.js +24 -0
- package/dist/operations/navigate-away.js.map +1 -0
- package/dist/operations/navigate-away.test.d.ts +2 -0
- package/dist/operations/navigate-away.test.d.ts.map +1 -0
- package/dist/operations/navigate-away.test.js +51 -0
- package/dist/operations/navigate-away.test.js.map +1 -0
- package/dist/operations/query-messages.d.ts +1 -1
- package/dist/operations/query-messages.d.ts.map +1 -1
- package/dist/operations/query-messages.js +3 -6
- package/dist/operations/query-messages.js.map +1 -1
- package/dist/operations/react-to-post.d.ts +16 -4
- package/dist/operations/react-to-post.d.ts.map +1 -1
- package/dist/operations/react-to-post.js +86 -24
- package/dist/operations/react-to-post.js.map +1 -1
- package/dist/operations/react-to-post.test.js +55 -5
- package/dist/operations/react-to-post.test.js.map +1 -1
- package/dist/operations/remove-connection.test.d.ts +2 -0
- package/dist/operations/remove-connection.test.d.ts.map +1 -0
- package/dist/operations/remove-connection.test.js +45 -0
- package/dist/operations/remove-connection.test.js.map +1 -0
- package/dist/operations/remove-people-from-collection.d.ts +1 -1
- package/dist/operations/remove-people-from-collection.d.ts.map +1 -1
- package/dist/operations/remove-people-from-collection.js +3 -6
- package/dist/operations/remove-people-from-collection.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -1
- package/dist/operations/resolve-linkedin-entity.js +2 -2
- package/dist/operations/resolve-linkedin-entity.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.test.d.ts +2 -0
- package/dist/operations/resolve-linkedin-entity.test.d.ts.map +1 -0
- package/dist/operations/resolve-linkedin-entity.test.js +343 -0
- package/dist/operations/resolve-linkedin-entity.test.js.map +1 -0
- package/dist/operations/scrape-messaging-history.d.ts +2 -1
- package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
- package/dist/operations/scrape-messaging-history.js +113 -18
- package/dist/operations/scrape-messaging-history.js.map +1 -1
- package/dist/operations/scrape-messaging-history.test.js +109 -12
- package/dist/operations/scrape-messaging-history.test.js.map +1 -1
- package/dist/operations/search-posts.d.ts +20 -112
- package/dist/operations/search-posts.d.ts.map +1 -1
- package/dist/operations/search-posts.js +369 -170
- package/dist/operations/search-posts.js.map +1 -1
- package/dist/operations/search-posts.test.js +273 -234
- package/dist/operations/search-posts.test.js.map +1 -1
- package/dist/operations/send-inmail.test.d.ts +2 -0
- package/dist/operations/send-inmail.test.d.ts.map +1 -0
- package/dist/operations/send-inmail.test.js +108 -0
- package/dist/operations/send-inmail.test.js.map +1 -0
- package/dist/operations/send-invite.test.d.ts +2 -0
- package/dist/operations/send-invite.test.d.ts.map +1 -0
- package/dist/operations/send-invite.test.js +59 -0
- package/dist/operations/send-invite.test.js.map +1 -0
- package/dist/operations/types.d.ts +27 -1
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/operations/types.js +14 -1
- package/dist/operations/types.js.map +1 -1
- package/dist/operations/visit-profile.d.ts +1 -1
- package/dist/operations/visit-profile.d.ts.map +1 -1
- package/dist/operations/visit-profile.js +3 -6
- package/dist/operations/visit-profile.js.map +1 -1
- package/dist/services/account-resolution.d.ts +10 -4
- package/dist/services/account-resolution.d.ts.map +1 -1
- package/dist/services/account-resolution.js +63 -5
- package/dist/services/account-resolution.js.map +1 -1
- package/dist/services/app.d.ts +6 -2
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +18 -6
- package/dist/services/app.js.map +1 -1
- package/dist/services/app.test.js +41 -7
- package/dist/services/app.test.js.map +1 -1
- package/dist/services/campaign.d.ts +40 -4
- package/dist/services/campaign.d.ts.map +1 -1
- package/dist/services/campaign.js +176 -10
- package/dist/services/campaign.js.map +1 -1
- package/dist/services/campaign.test.js +53 -15
- package/dist/services/campaign.test.js.map +1 -1
- package/dist/services/collection.d.ts +16 -21
- package/dist/services/collection.d.ts.map +1 -1
- package/dist/services/collection.js +34 -47
- package/dist/services/collection.js.map +1 -1
- package/dist/services/collection.test.js +30 -91
- package/dist/services/collection.test.js.map +1 -1
- package/dist/services/ephemeral-campaign.d.ts +6 -0
- package/dist/services/ephemeral-campaign.d.ts.map +1 -1
- package/dist/services/ephemeral-campaign.js +54 -10
- package/dist/services/ephemeral-campaign.js.map +1 -1
- package/dist/services/ephemeral-campaign.test.js +23 -10
- package/dist/services/ephemeral-campaign.test.js.map +1 -1
- package/dist/services/errors.d.ts +2 -1
- package/dist/services/errors.d.ts.map +1 -1
- package/dist/services/errors.js +6 -3
- package/dist/services/errors.js.map +1 -1
- package/dist/services/index.d.ts +1 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-context.d.ts +5 -1
- package/dist/services/instance-context.d.ts.map +1 -1
- package/dist/services/instance-context.js +87 -28
- package/dist/services/instance-context.js.map +1 -1
- package/dist/services/instance-context.test.js +5 -1
- package/dist/services/instance-context.test.js.map +1 -1
- package/dist/services/instance-lifecycle.d.ts.map +1 -1
- package/dist/services/instance-lifecycle.js +32 -1
- package/dist/services/instance-lifecycle.js.map +1 -1
- package/dist/services/instance-lifecycle.test.js +52 -1
- package/dist/services/instance-lifecycle.test.js.map +1 -1
- package/dist/services/instance.d.ts +37 -9
- package/dist/services/instance.d.ts.map +1 -1
- package/dist/services/instance.js +100 -25
- package/dist/services/instance.js.map +1 -1
- package/dist/services/instance.test.js +157 -0
- package/dist/services/instance.test.js.map +1 -1
- package/dist/services/launcher.d.ts +47 -3
- package/dist/services/launcher.d.ts.map +1 -1
- package/dist/services/launcher.js +205 -33
- package/dist/services/launcher.js.map +1 -1
- package/dist/services/launcher.test.js +133 -6
- package/dist/services/launcher.test.js.map +1 -1
- package/dist/services/source-type-registry.d.ts +8 -0
- package/dist/services/source-type-registry.d.ts.map +1 -1
- package/dist/services/source-type-registry.js +39 -0
- package/dist/services/source-type-registry.js.map +1 -1
- package/dist/services/source-type-registry.test.js +31 -1
- package/dist/services/source-type-registry.test.js.map +1 -1
- package/dist/services/status.d.ts +6 -2
- package/dist/services/status.d.ts.map +1 -1
- package/dist/services/status.js +67 -34
- package/dist/services/status.js.map +1 -1
- package/dist/services/status.test.js +9 -2
- package/dist/services/status.test.js.map +1 -1
- package/dist/testing/e2e-helpers.d.ts +47 -1
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +244 -7
- package/dist/testing/e2e-helpers.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types/account.d.ts +1 -1
- package/dist/types/campaign.d.ts +1 -1
- package/dist/types/campaign.d.ts.map +1 -1
- package/dist/types/feed.d.ts +1 -3
- package/dist/types/feed.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cdp-port.d.ts.map +1 -1
- package/dist/utils/cdp-port.js +3 -1
- package/dist/utils/cdp-port.js.map +1 -1
- package/dist/utils/cdp-port.test.js +1 -1
- package/dist/utils/cdp-port.test.js.map +1 -1
- package/dist/utils/delay.d.ts +79 -0
- package/dist/utils/delay.d.ts.map +1 -1
- package/dist/utils/delay.js +118 -0
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/delay.test.js +111 -1
- package/dist/utils/delay.test.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session-pacer.d.ts +27 -0
- package/dist/utils/session-pacer.d.ts.map +1 -0
- package/dist/utils/session-pacer.js +55 -0
- package/dist/utils/session-pacer.js.map +1 -0
- package/dist/utils/session-pacer.test.d.ts +2 -0
- package/dist/utils/session-pacer.test.d.ts.map +1 -0
- package/dist/utils/session-pacer.test.js +111 -0
- package/dist/utils/session-pacer.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts +0 -2
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +0 -1
- package/dist/linkedin/__tests__/selectors.integration.test.js +0 -258
- package/dist/linkedin/__tests__/selectors.integration.test.js.map +0 -1
- package/dist/types/search-posts.d.ts +0 -22
- package/dist/types/search-posts.d.ts.map +0 -1
- package/dist/types/search-posts.js +0 -4
- package/dist/types/search-posts.js.map +0 -1
- package/dist/voyager/index.d.ts +0 -2
- package/dist/voyager/index.d.ts.map +0 -1
- package/dist/voyager/index.js +0 -4
- package/dist/voyager/index.js.map +0 -1
- package/dist/voyager/interceptor.d.ts +0 -100
- package/dist/voyager/interceptor.d.ts.map +0 -1
- package/dist/voyager/interceptor.integration.test.d.ts +0 -2
- package/dist/voyager/interceptor.integration.test.d.ts.map +0 -1
- package/dist/voyager/interceptor.integration.test.js +0 -89
- package/dist/voyager/interceptor.integration.test.js.map +0 -1
- package/dist/voyager/interceptor.js +0 -235
- package/dist/voyager/interceptor.js.map +0 -1
- package/dist/voyager/interceptor.test.d.ts +0 -2
- package/dist/voyager/interceptor.test.d.ts.map +0 -1
- package/dist/voyager/interceptor.test.js +0 -372
- package/dist/voyager/interceptor.test.js.map +0 -1
package/dist/utils/delay.js
CHANGED
|
@@ -6,4 +6,122 @@
|
|
|
6
6
|
export function delay(ms) {
|
|
7
7
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Return a promise that resolves after a random delay between `min` and `max` milliseconds.
|
|
11
|
+
*
|
|
12
|
+
* This mimics human timing variations such as thinking pauses and
|
|
13
|
+
* visual scanning between UI interactions.
|
|
14
|
+
*/
|
|
15
|
+
export function randomDelay(min, max) {
|
|
16
|
+
return delay(min + Math.random() * (max - min));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Return a random number between `min` and `max` (inclusive of min, exclusive of max).
|
|
20
|
+
*
|
|
21
|
+
* Useful for randomising scroll distances, coordinate offsets, and other
|
|
22
|
+
* non-delay numeric values that benefit from human-like variation.
|
|
23
|
+
*/
|
|
24
|
+
export function randomBetween(min, max) {
|
|
25
|
+
return min + Math.random() * (max - min);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* With the given probability (default 12%), insert a random pause of 500–2000 ms.
|
|
29
|
+
*
|
|
30
|
+
* Simulates the irregular micro-pauses humans exhibit: hovering briefly,
|
|
31
|
+
* momentarily slowing, or pausing before deciding to act. Breaks
|
|
32
|
+
* statistical uniformity in timing patterns without adding significant
|
|
33
|
+
* average time.
|
|
34
|
+
*/
|
|
35
|
+
export function maybeHesitate(probability = 0.12) {
|
|
36
|
+
if (Math.random() < probability) {
|
|
37
|
+
return gaussianDelay(1_250, 375, 500, 2_000);
|
|
38
|
+
}
|
|
39
|
+
return Promise.resolve();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* With the given probability (default 4%), insert a longer pause of 2–12 s.
|
|
43
|
+
*
|
|
44
|
+
* Simulates the natural micro-breaks humans take during extended browsing
|
|
45
|
+
* sessions: checking another tab, reading a notification, sipping coffee.
|
|
46
|
+
* Intended for use inside long scroll or extraction loops to break up
|
|
47
|
+
* otherwise rhythmic interaction patterns.
|
|
48
|
+
*/
|
|
49
|
+
export function maybeBreak(probability = 0.04) {
|
|
50
|
+
if (Math.random() < probability) {
|
|
51
|
+
return gaussianDelay(5_000, 2_000, 2_000, 12_000);
|
|
52
|
+
}
|
|
53
|
+
return Promise.resolve();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Return a normally-distributed random number using the Box-Muller transform.
|
|
57
|
+
*
|
|
58
|
+
* The result is centered on `mean` with the given `stdDev`. Unlike
|
|
59
|
+
* uniform `Math.random()`, this produces a bell-curve distribution
|
|
60
|
+
* that more closely models human timing variance.
|
|
61
|
+
*/
|
|
62
|
+
export function gaussianRandom(mean, stdDev) {
|
|
63
|
+
// Box-Muller transform: two uniform samples → one normal sample
|
|
64
|
+
let u1;
|
|
65
|
+
let u2;
|
|
66
|
+
do {
|
|
67
|
+
u1 = Math.random();
|
|
68
|
+
u2 = Math.random();
|
|
69
|
+
} while (u1 === 0); // avoid log(0)
|
|
70
|
+
const z = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);
|
|
71
|
+
return mean + z * stdDev;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Return a promise that resolves after a Gaussian-distributed delay.
|
|
75
|
+
*
|
|
76
|
+
* The delay is drawn from a normal distribution centered on `mean` with
|
|
77
|
+
* the given `stdDev`, then clamped to `[min, max]`. This produces more
|
|
78
|
+
* human-like timing than uniform random — most delays cluster near the
|
|
79
|
+
* mean with occasional faster or slower outliers.
|
|
80
|
+
*
|
|
81
|
+
* @param mean - Center of the distribution in milliseconds.
|
|
82
|
+
* @param stdDev - Standard deviation in milliseconds.
|
|
83
|
+
* @param min - Minimum delay in milliseconds (default: 0).
|
|
84
|
+
* @param max - Maximum delay in milliseconds (default: Infinity).
|
|
85
|
+
*/
|
|
86
|
+
export function gaussianDelay(mean, stdDev, min = 0, max = Infinity) {
|
|
87
|
+
const raw = gaussianRandom(mean, stdDev);
|
|
88
|
+
const clamped = Math.max(min, Math.min(max, raw));
|
|
89
|
+
return delay(clamped);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Return a Gaussian-distributed numeric value clamped to `[min, max]`.
|
|
93
|
+
*
|
|
94
|
+
* Useful for randomising scroll distances, coordinate offsets, and other
|
|
95
|
+
* non-delay numeric values that benefit from human-like variation.
|
|
96
|
+
*
|
|
97
|
+
* @param mean - Center of the distribution.
|
|
98
|
+
* @param stdDev - Standard deviation.
|
|
99
|
+
* @param min - Minimum value.
|
|
100
|
+
* @param max - Maximum value.
|
|
101
|
+
*/
|
|
102
|
+
export function gaussianBetween(mean, stdDev, min, max) {
|
|
103
|
+
const raw = gaussianRandom(mean, stdDev);
|
|
104
|
+
return Math.max(min, Math.min(max, raw));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Simulate reading time proportional to content length.
|
|
108
|
+
*
|
|
109
|
+
* Models a human scanning visible content at approximately 250 words per
|
|
110
|
+
* minute (assuming ~5 characters per word). Only a fraction of the full
|
|
111
|
+
* reading time is used (default 30%) because users skim rather than read
|
|
112
|
+
* every word. The result is drawn from a Gaussian distribution centered
|
|
113
|
+
* on the computed reading time, clamped to `[500, 8000]` ms.
|
|
114
|
+
*
|
|
115
|
+
* @param contentLength - Approximate character count of the visible content.
|
|
116
|
+
* @param readFraction - Fraction of full reading time to simulate (default: 0.3).
|
|
117
|
+
*/
|
|
118
|
+
export function simulateReadingTime(contentLength, readFraction = 0.3) {
|
|
119
|
+
const safeLength = Number.isFinite(contentLength) && contentLength > 0 ? contentLength : 0;
|
|
120
|
+
const safeFraction = Number.isFinite(readFraction)
|
|
121
|
+
? Math.max(0, Math.min(1, readFraction))
|
|
122
|
+
: 0.3;
|
|
123
|
+
const words = safeLength / 5;
|
|
124
|
+
const readTimeMs = (words / 250) * 60_000 * safeFraction;
|
|
125
|
+
return gaussianDelay(readTimeMs, readTimeMs * 0.3, 500, 8_000);
|
|
126
|
+
}
|
|
9
127
|
//# sourceMappingURL=delay.js.map
|
package/dist/utils/delay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delay.js","sourceRoot":"","sources":["../../src/utils/delay.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"delay.js","sourceRoot":"","sources":["../../src/utils/delay.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/delay.test.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
import { describe, expect, it } from "vitest";
|
|
4
|
-
import { delay } from "./delay.js";
|
|
4
|
+
import { delay, randomBetween, maybeHesitate, maybeBreak, gaussianRandom, gaussianBetween, simulateReadingTime, } from "./delay.js";
|
|
5
5
|
describe("delay", () => {
|
|
6
6
|
it("should resolve after the given time", async () => {
|
|
7
7
|
const start = Date.now();
|
|
@@ -14,4 +14,114 @@ describe("delay", () => {
|
|
|
14
14
|
expect(result).toBeUndefined();
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
|
+
describe("randomBetween", () => {
|
|
18
|
+
it("returns a value within the specified range", () => {
|
|
19
|
+
for (let i = 0; i < 100; i++) {
|
|
20
|
+
const value = randomBetween(10, 20);
|
|
21
|
+
expect(value).toBeGreaterThanOrEqual(10);
|
|
22
|
+
expect(value).toBeLessThan(20);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it("returns min when range is zero", () => {
|
|
26
|
+
expect(randomBetween(5, 5)).toBe(5);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("gaussianRandom", () => {
|
|
30
|
+
it("produces values with approximately correct mean and stdDev over many samples", () => {
|
|
31
|
+
const mean = 100;
|
|
32
|
+
const stdDev = 25;
|
|
33
|
+
const n = 10_000;
|
|
34
|
+
const samples = [];
|
|
35
|
+
for (let i = 0; i < n; i++) {
|
|
36
|
+
samples.push(gaussianRandom(mean, stdDev));
|
|
37
|
+
}
|
|
38
|
+
const sampleMean = samples.reduce((a, b) => a + b, 0) / n;
|
|
39
|
+
const sampleVariance = samples.reduce((sum, x) => sum + (x - sampleMean) ** 2, 0) / (n - 1);
|
|
40
|
+
const sampleStdDev = Math.sqrt(sampleVariance);
|
|
41
|
+
// Allow ±5% tolerance on mean and ±10% on stdDev
|
|
42
|
+
expect(sampleMean).toBeGreaterThan(mean * 0.95);
|
|
43
|
+
expect(sampleMean).toBeLessThan(mean * 1.05);
|
|
44
|
+
expect(sampleStdDev).toBeGreaterThan(stdDev * 0.9);
|
|
45
|
+
expect(sampleStdDev).toBeLessThan(stdDev * 1.1);
|
|
46
|
+
});
|
|
47
|
+
it("centers on the given mean when stdDev is 0", () => {
|
|
48
|
+
for (let i = 0; i < 100; i++) {
|
|
49
|
+
expect(gaussianRandom(42, 0)).toBe(42);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("gaussianBetween", () => {
|
|
54
|
+
it("always returns values within [min, max]", () => {
|
|
55
|
+
for (let i = 0; i < 1_000; i++) {
|
|
56
|
+
const value = gaussianBetween(500, 100, 300, 700);
|
|
57
|
+
expect(value).toBeGreaterThanOrEqual(300);
|
|
58
|
+
expect(value).toBeLessThanOrEqual(700);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it("returns min when range is zero", () => {
|
|
62
|
+
expect(gaussianBetween(5, 0, 5, 5)).toBe(5);
|
|
63
|
+
});
|
|
64
|
+
it("clamps values that would exceed bounds", () => {
|
|
65
|
+
// With a very large stdDev, values should still be clamped
|
|
66
|
+
for (let i = 0; i < 100; i++) {
|
|
67
|
+
const value = gaussianBetween(50, 1_000, 0, 100);
|
|
68
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
69
|
+
expect(value).toBeLessThanOrEqual(100);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("maybeHesitate", () => {
|
|
74
|
+
it("resolves to undefined", async () => {
|
|
75
|
+
const result = await maybeHesitate(0);
|
|
76
|
+
expect(result).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
it("never pauses with probability 0", async () => {
|
|
79
|
+
const start = Date.now();
|
|
80
|
+
await maybeHesitate(0);
|
|
81
|
+
expect(Date.now() - start).toBeLessThan(50);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("maybeBreak", () => {
|
|
85
|
+
it("resolves to undefined", async () => {
|
|
86
|
+
const result = await maybeBreak(0);
|
|
87
|
+
expect(result).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
it("never pauses with probability 0", async () => {
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
await maybeBreak(0);
|
|
92
|
+
expect(Date.now() - start).toBeLessThan(50);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("simulateReadingTime", () => {
|
|
96
|
+
it("resolves to undefined", async () => {
|
|
97
|
+
const result = await simulateReadingTime(100, 0);
|
|
98
|
+
expect(result).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
it("clamps to minimum of 500 ms for zero-length content", async () => {
|
|
101
|
+
const start = Date.now();
|
|
102
|
+
await simulateReadingTime(0);
|
|
103
|
+
const elapsed = Date.now() - start;
|
|
104
|
+
expect(elapsed).toBeGreaterThanOrEqual(400);
|
|
105
|
+
});
|
|
106
|
+
it("clamps to minimum of 500 ms when readFraction is 0", async () => {
|
|
107
|
+
const start = Date.now();
|
|
108
|
+
await simulateReadingTime(10_000, 0);
|
|
109
|
+
const elapsed = Date.now() - start;
|
|
110
|
+
expect(elapsed).toBeGreaterThanOrEqual(400);
|
|
111
|
+
});
|
|
112
|
+
it("sanitises non-finite contentLength to 0", async () => {
|
|
113
|
+
const start = Date.now();
|
|
114
|
+
await simulateReadingTime(NaN);
|
|
115
|
+
const elapsed = Date.now() - start;
|
|
116
|
+
// NaN contentLength → safeLength=0 → mean=0 → clamped to 500 ms minimum
|
|
117
|
+
expect(elapsed).toBeGreaterThanOrEqual(400);
|
|
118
|
+
});
|
|
119
|
+
it("sanitises non-finite readFraction to default", async () => {
|
|
120
|
+
const start = Date.now();
|
|
121
|
+
await simulateReadingTime(100, NaN);
|
|
122
|
+
const elapsed = Date.now() - start;
|
|
123
|
+
// NaN readFraction → safeFraction=0.3 (default) → ~720 ms mean
|
|
124
|
+
expect(elapsed).toBeGreaterThanOrEqual(400);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
17
127
|
//# sourceMappingURL=delay.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delay.test.js","sourceRoot":"","sources":["../../src/utils/delay.test.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"delay.test.js","sourceRoot":"","sources":["../../src/utils/delay.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { isCdpPort } from "./cdp-port.js";
|
|
2
|
-
export { delay } from "./delay.js";
|
|
2
|
+
export { delay, randomDelay, gaussianRandom, gaussianDelay, gaussianBetween, maybeBreak, simulateReadingTime } from "./delay.js";
|
|
3
3
|
export { errorMessage } from "./error-message.js";
|
|
4
4
|
export { isLoopbackAddress } from "./loopback.js";
|
|
5
|
+
export { SessionPacer, rhythmMultiplier } from "./session-pacer.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjI,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
export { isCdpPort } from "./cdp-port.js";
|
|
4
|
-
export { delay } from "./delay.js";
|
|
4
|
+
export { delay, randomDelay, gaussianRandom, gaussianDelay, gaussianBetween, maybeBreak, simulateReadingTime } from "./delay.js";
|
|
5
5
|
export { errorMessage } from "./error-message.js";
|
|
6
6
|
export { isLoopbackAddress } from "./loopback.js";
|
|
7
|
+
export { SessionPacer, rhythmMultiplier } from "./session-pacer.js";
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjI,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the session rhythm multiplier based on operation count.
|
|
3
|
+
*
|
|
4
|
+
* Models the natural pacing of a human browsing session:
|
|
5
|
+
* - **Warm-up (ops 0–2):** 1.5× — slower, exploring, getting oriented
|
|
6
|
+
* - **Cruising (ops 3–8):** 0.85× — in the flow, comfortable pace
|
|
7
|
+
* - **Fatigue (ops 9+):** 1.0 + 0.05 × (n − 8) — gradually slowing down
|
|
8
|
+
*/
|
|
9
|
+
export declare function rhythmMultiplier(operationCount: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Session-level pacer that tracks inter-operation timing and enforces
|
|
12
|
+
* minimum gaps between operations to prevent rapid-fire automation patterns.
|
|
13
|
+
*
|
|
14
|
+
* Each operation should call {@link paceBeforeOperation} before starting
|
|
15
|
+
* and {@link recordOperationEnd} after completing. The pacer applies a
|
|
16
|
+
* Gaussian-distributed cool-down scaled by a session rhythm multiplier
|
|
17
|
+
* that models warm-up, cruising, and fatigue phases.
|
|
18
|
+
*/
|
|
19
|
+
export declare class SessionPacer {
|
|
20
|
+
private lastOperationEnd;
|
|
21
|
+
private operationCount;
|
|
22
|
+
/** Call before starting an operation. Resolves after the appropriate cool-down. */
|
|
23
|
+
paceBeforeOperation(operationType: "read" | "write"): Promise<void>;
|
|
24
|
+
/** Call after an operation completes to record its end timestamp. */
|
|
25
|
+
recordOperationEnd(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=session-pacer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pacer.d.ts","sourceRoot":"","sources":["../../src/utils/session-pacer.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAE3B,oFAAoF;IAC9E,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzE,qEAAqE;IACrE,kBAAkB,IAAI,IAAI;CAI3B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { delay, gaussianBetween } from "./delay.js";
|
|
4
|
+
/**
|
|
5
|
+
* Compute the session rhythm multiplier based on operation count.
|
|
6
|
+
*
|
|
7
|
+
* Models the natural pacing of a human browsing session:
|
|
8
|
+
* - **Warm-up (ops 0–2):** 1.5× — slower, exploring, getting oriented
|
|
9
|
+
* - **Cruising (ops 3–8):** 0.85× — in the flow, comfortable pace
|
|
10
|
+
* - **Fatigue (ops 9+):** 1.0 + 0.05 × (n − 8) — gradually slowing down
|
|
11
|
+
*/
|
|
12
|
+
export function rhythmMultiplier(operationCount) {
|
|
13
|
+
if (operationCount <= 2)
|
|
14
|
+
return 1.5;
|
|
15
|
+
if (operationCount <= 8)
|
|
16
|
+
return 0.85;
|
|
17
|
+
return 1.0 + 0.05 * (operationCount - 8);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Session-level pacer that tracks inter-operation timing and enforces
|
|
21
|
+
* minimum gaps between operations to prevent rapid-fire automation patterns.
|
|
22
|
+
*
|
|
23
|
+
* Each operation should call {@link paceBeforeOperation} before starting
|
|
24
|
+
* and {@link recordOperationEnd} after completing. The pacer applies a
|
|
25
|
+
* Gaussian-distributed cool-down scaled by a session rhythm multiplier
|
|
26
|
+
* that models warm-up, cruising, and fatigue phases.
|
|
27
|
+
*/
|
|
28
|
+
export class SessionPacer {
|
|
29
|
+
lastOperationEnd = 0;
|
|
30
|
+
operationCount = 0;
|
|
31
|
+
/** Call before starting an operation. Resolves after the appropriate cool-down. */
|
|
32
|
+
async paceBeforeOperation(operationType) {
|
|
33
|
+
const now = Date.now();
|
|
34
|
+
// First operation — no cool-down needed
|
|
35
|
+
if (this.lastOperationEnd === 0)
|
|
36
|
+
return;
|
|
37
|
+
const elapsed = now - this.lastOperationEnd;
|
|
38
|
+
const multiplier = rhythmMultiplier(this.operationCount);
|
|
39
|
+
// Base cool-down parameters per operation type
|
|
40
|
+
const baseDelay = operationType === "read"
|
|
41
|
+
? gaussianBetween(2_500, 800, 1_000, 5_000)
|
|
42
|
+
: gaussianBetween(8_000, 3_000, 3_000, 18_000);
|
|
43
|
+
const required = baseDelay * multiplier;
|
|
44
|
+
const remaining = required - elapsed;
|
|
45
|
+
if (remaining > 0) {
|
|
46
|
+
await delay(remaining);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Call after an operation completes to record its end timestamp. */
|
|
50
|
+
recordOperationEnd() {
|
|
51
|
+
this.lastOperationEnd = Date.now();
|
|
52
|
+
this.operationCount++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=session-pacer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pacer.js","sourceRoot":"","sources":["../../src/utils/session-pacer.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACf,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAG,CAAC,CAAC;IAE3B,oFAAoF;IACpF,KAAK,CAAC,mBAAmB,CAAC,aAA+B;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,wCAAwC;QACxC,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC;YAAE,OAAO;QAExC,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEzD,+CAA+C;QAC/C,MAAM,SAAS,GACb,aAAa,KAAK,MAAM;YACtB,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;YAC3C,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;QACxC,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;QAErC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,kBAAkB;QAChB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pacer.test.d.ts","sourceRoot":"","sources":["../../src/utils/session-pacer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
|
|
4
|
+
import { SessionPacer, rhythmMultiplier } from "./session-pacer.js";
|
|
5
|
+
describe("rhythmMultiplier", () => {
|
|
6
|
+
it("returns 1.5 for warm-up phase (ops 0–2)", () => {
|
|
7
|
+
expect(rhythmMultiplier(0)).toBe(1.5);
|
|
8
|
+
expect(rhythmMultiplier(1)).toBe(1.5);
|
|
9
|
+
expect(rhythmMultiplier(2)).toBe(1.5);
|
|
10
|
+
});
|
|
11
|
+
it("returns 0.85 for cruising phase (ops 3–8)", () => {
|
|
12
|
+
expect(rhythmMultiplier(3)).toBe(0.85);
|
|
13
|
+
expect(rhythmMultiplier(5)).toBe(0.85);
|
|
14
|
+
expect(rhythmMultiplier(8)).toBe(0.85);
|
|
15
|
+
});
|
|
16
|
+
it("returns increasing multiplier for fatigue phase (ops 9+)", () => {
|
|
17
|
+
expect(rhythmMultiplier(9)).toBeCloseTo(1.05);
|
|
18
|
+
expect(rhythmMultiplier(10)).toBeCloseTo(1.1);
|
|
19
|
+
expect(rhythmMultiplier(18)).toBeCloseTo(1.5);
|
|
20
|
+
expect(rhythmMultiplier(28)).toBeCloseTo(2.0);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe("SessionPacer", () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
vi.useFakeTimers();
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
vi.useRealTimers();
|
|
29
|
+
});
|
|
30
|
+
it("skips cool-down for the first operation", async () => {
|
|
31
|
+
const pacer = new SessionPacer();
|
|
32
|
+
const start = Date.now();
|
|
33
|
+
const promise = pacer.paceBeforeOperation("read");
|
|
34
|
+
await vi.runAllTimersAsync();
|
|
35
|
+
await promise;
|
|
36
|
+
// Should resolve immediately — no delay for first operation
|
|
37
|
+
expect(Date.now() - start).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
it("enforces cool-down after first operation completes", async () => {
|
|
40
|
+
const pacer = new SessionPacer();
|
|
41
|
+
// Complete a first operation
|
|
42
|
+
pacer.recordOperationEnd();
|
|
43
|
+
// Immediately request pacing for the next — should delay
|
|
44
|
+
const promise = pacer.paceBeforeOperation("read");
|
|
45
|
+
// Advance timers to let the delay resolve
|
|
46
|
+
await vi.runAllTimersAsync();
|
|
47
|
+
await promise;
|
|
48
|
+
// The elapsed time should be positive (cool-down was applied)
|
|
49
|
+
expect(Date.now()).toBeGreaterThan(0);
|
|
50
|
+
});
|
|
51
|
+
it("skips cool-down when enough time has already elapsed", async () => {
|
|
52
|
+
const pacer = new SessionPacer();
|
|
53
|
+
// Complete first operation
|
|
54
|
+
pacer.recordOperationEnd();
|
|
55
|
+
// Advance time well past any possible cool-down
|
|
56
|
+
vi.advanceTimersByTime(60_000);
|
|
57
|
+
const timeBefore = Date.now();
|
|
58
|
+
const promise = pacer.paceBeforeOperation("read");
|
|
59
|
+
await vi.runAllTimersAsync();
|
|
60
|
+
await promise;
|
|
61
|
+
// No additional delay — the gap already exceeds the required cool-down
|
|
62
|
+
expect(Date.now() - timeBefore).toBe(0);
|
|
63
|
+
});
|
|
64
|
+
it("increments operation count on recordOperationEnd", async () => {
|
|
65
|
+
const pacer = new SessionPacer();
|
|
66
|
+
// First op — warm-up phase (1.5x), complete it
|
|
67
|
+
pacer.recordOperationEnd();
|
|
68
|
+
// Second op — still warm-up (1.5x)
|
|
69
|
+
const promise1 = pacer.paceBeforeOperation("read");
|
|
70
|
+
await vi.runAllTimersAsync();
|
|
71
|
+
await promise1;
|
|
72
|
+
pacer.recordOperationEnd();
|
|
73
|
+
// Third op — still warm-up (op count = 2)
|
|
74
|
+
const promise2 = pacer.paceBeforeOperation("read");
|
|
75
|
+
await vi.runAllTimersAsync();
|
|
76
|
+
await promise2;
|
|
77
|
+
pacer.recordOperationEnd();
|
|
78
|
+
// Fourth op — cruising phase (op count = 3, multiplier = 0.85)
|
|
79
|
+
const timeBefore = Date.now();
|
|
80
|
+
const promise3 = pacer.paceBeforeOperation("read");
|
|
81
|
+
await vi.runAllTimersAsync();
|
|
82
|
+
await promise3;
|
|
83
|
+
// The delay should be shorter in cruising than warm-up
|
|
84
|
+
// (0.85x vs 1.5x of the base Gaussian delay)
|
|
85
|
+
const elapsed = Date.now() - timeBefore;
|
|
86
|
+
expect(elapsed).toBeGreaterThan(0);
|
|
87
|
+
});
|
|
88
|
+
it("applies longer cool-down for write operations", async () => {
|
|
89
|
+
// Seed Math.random for deterministic comparison
|
|
90
|
+
vi.spyOn(Math, "random").mockReturnValue(0.5);
|
|
91
|
+
// Measure read cool-down
|
|
92
|
+
const readPacer = new SessionPacer();
|
|
93
|
+
readPacer.recordOperationEnd();
|
|
94
|
+
const readBefore = Date.now();
|
|
95
|
+
const readPromise = readPacer.paceBeforeOperation("read");
|
|
96
|
+
await vi.runAllTimersAsync();
|
|
97
|
+
await readPromise;
|
|
98
|
+
const readElapsed = Date.now() - readBefore;
|
|
99
|
+
// Measure write cool-down in a fresh pacer
|
|
100
|
+
const writePacer = new SessionPacer();
|
|
101
|
+
writePacer.recordOperationEnd();
|
|
102
|
+
const writeBefore = Date.now();
|
|
103
|
+
const writePromise = writePacer.paceBeforeOperation("write");
|
|
104
|
+
await vi.runAllTimersAsync();
|
|
105
|
+
await writePromise;
|
|
106
|
+
const writeElapsed = Date.now() - writeBefore;
|
|
107
|
+
// Write cool-down should be longer than read cool-down
|
|
108
|
+
expect(writeElapsed).toBeGreaterThan(readElapsed);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=session-pacer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pacer.test.js","sourceRoot":"","sources":["../../src/utils/session-pacer.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.integration.test.d.ts","sourceRoot":"","sources":["../../../src/linkedin/__tests__/selectors.integration.test.ts"],"names":[],"mappings":""}
|