Repository navigation
Add LinkedIn Autopilot: read-only LinkedIn connector and loop - #7
Merged
Merged
Conversation
…uns and report unrecognised pages
…opilot loop's sidebar icon
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed and why
Adds LinkedIn Autopilot, Stage 1 (read-only): a
linkedinconnector and alinkedin-autopilot-loopthat browse your own signed-in LinkedIn session at a human pace, read the feed, notifications and messages, and leave a summary (topics, posts worth reading, people to know) in the Content tab and Slack. The loop ships disabled. Likes, connection requests, daily caps, a kill switch and an action log are Stage 2 and are not in this PR; nothing here can click, like, post or send.Connector (
bin/connectors/linkedin.py,bin/linkedin_session.py,bin/linkedin_login.py)<LOOP_ENGINEERING_HOME or ~/.loop-engineering>/linkedin/<id>/profile/(mode 0700, outside the repo, resolved at call time). No password is stored. Cookies are only weakly protected at rest (Playwright's mock keychain); Disconnect wipes the profile.Human-like browsing (
bin/linkedin_humanize.py,bin/linkedin_browser.py)headlessis a setting (default off = visible Chrome).HumanPageis the only code that drives the page; an AST test enforces thatlinkedin_browser.pynever callsgoto/click/type/etc. itself.<title>/<h1>/<h2>).Loop (
bin/loop_plugins/linkedin_autopilot.py,loops/linkedin-autopilot/)headless,active_hours,topics. Registered disabled inconfig/loops.json.template(requires: ["social"]), with a Content-tab renderer, docs (docs/tasks/linkedin-autopilot-loop.md), README, TASK.md and CHANGELOG entries, and ja/zh/fr translations.Risk to know about: LinkedIn has no API for this and its terms prohibit automation, so the account can be restricted. Pacing, the active-hours window, skipped days and stop-on-security-check reduce that risk; they do not remove it. Requires
python3 -m pip install playwrightand Google Chrome.Verification
python3 -m pytest tests/ -qpasses (3101 passed; 2988 onmainbefore this branch)CHANGELOG.mdhas a line under[Unreleased](user-visible changes only)bin/linkedin_browser.py. Please run a sandboxed manual check (scratchLOOP_ENGINEERING_HOME, Connect, run the loop once with--force) before enabling the loop; if a parser returns nothing on a real page the loop now reports "LinkedIn's page layout was not recognised" instead of silently finding nothing.Golden eval (agent instruction/tool changes only)
This PR adds
loops/linkedin-autopilot/prompt.md, which the checklist covers, but a before/afterloop eval --goldenwould not exercise it: the golden suite (evals/golden/*) only runs the GitLab issue agent, and no LoopKit plugin prompt has a case type. I did not run it (it costs real money and would produce an identical before/after). The prompt is covered by unit tests (shape, caps, untrusted-content rule, id validation against offered items). Adding plugin-prompt eval cases is a follow-up for the harness.Before
After