ilml-plugin-linkedin 1.9.0 → 1.11.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/CHANGELOG.md +12 -1
- package/README.md +17 -13
- package/dist/syncAll.mjs +137 -133
- package/ilml-plugin.json +2 -2
- package/package.json +8 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.11.0
|
|
4
|
+
- **`sync-all` no longer gives up when a single thread misbehaves.** LinkedIn's inbox occasionally reacts to an automated search input by navigating the page away from `/messaging/` mid-sync. In v1.10.0 that single navigation killed the entire remaining queue — the run would abort on, say, item 1 of 67 and silently leave 66 unread. The thread loop now treats both thrown exceptions and verified-false returns the same way: log it, hand the thread to the sidebar fallback below, and keep moving. A bad thread costs that one slot, not the whole sync.
|
|
5
|
+
- **`sync-all` now reaches conversations buried deep in the inbox.** LinkedIn only renders ~20 sidebar cards at a time and lazy-loads the rest on scroll. Older threads — including any conversation that hadn't received a recent message — sat outside that initial window, so the existing "click the card in the sidebar" path couldn't find them. When that fails, the sync now navigates back to `/messaging/`, scrolls the sidebar from the top, and reopens the thread once its card has been loaded. The happy path (top-of-inbox conversations found by direct click) is unchanged — only previously-failing threads pay the extra scrolling time.
|
|
6
|
+
- No schema migration; existing data files unchanged.
|
|
7
|
+
|
|
8
|
+
## 1.10.0
|
|
9
|
+
- **`sync-all` no longer crashes mid-run when the LinkedIn browser session freezes.** On a large inbox (2000+ conversations, 600+ threads to re-read), the browser tab would occasionally stall after an hour of scrolling and reading. A single stall used to abort the whole sync and lose the rest of the progress for that run — the user had to re-launch from scratch, often multiple times before any single run completed. The same auto-recovery that already protects `apply` (since v1.4.0) is now applied to `sync-all`: when the browser stalls, the script switches to a fresh tab and continues. In the inbox-scan phase that means restarting the scan from the top (up to 3 retries). In the thread-reading phase it means skipping that one problem thread (it'll be re-flagged on the next sync — nothing is lost) and continuing with the next. The `--backfill` mode (re-reads conversations stored with empty message lists) is covered by the same recovery. On large catch-up runs this is the difference between "finishes in one pass" vs. "needs 5-10 manual restarts."
|
|
10
|
+
- **Session summary** reports the recovery count when it actually happened. Healthy runs print nothing new.
|
|
11
|
+
- Documentation: clarified the plugin's data-ownership intent and added a usage advisory pointing to LinkedIn's terms.
|
|
12
|
+
- No schema migration; nothing on disk changed.
|
|
13
|
+
|
|
3
14
|
## 1.9.0
|
|
4
15
|
- **Apply phase no longer quits early after a CDP recovery.** v1.4.0 made the runner survive a dead Puppeteer↔Chrome channel, but `iterateAllPages` still exited the moment any pass produced 0 new submits — and a freshly recovered page often returns an empty job list on the very next scrape (page state hasn't fully restored). So a single CDP death anywhere in the pass would end the apply phase well before the daily quota was filled, even though there were plenty more jobs to apply to. The pass-exit check now also tracks how many CDP recoveries happened during the pass: if there were any and submits = 0, the next pass runs regardless (still bounded by `MAX_PASSES = 3`). Net effect: a recovery costs at most one stalled scrape, not the entire remaining daily allowance. Re-applying to the same job after recovery is already safe — the existing "Applied N ago" badge check at the start of `processJob` skips it cleanly without re-clicking Apply.
|
|
5
16
|
- No schema migration. Pass-bookkeeping is in-process state; nothing on disk changed. `CURRENT_SCHEMA_VERSION` unchanged.
|
|
@@ -73,7 +84,7 @@
|
|
|
73
84
|
- Cleaner top — removed the metadata bullet list (npm/tracker/license) that was the very first thing visitors saw on the npm page; now opens straight into "What it does"
|
|
74
85
|
- Removed the entire `Developer Notes` section — it was internal-only and not useful for end users (release process and architecture notes live in `CLAUDE.md` and the SDK's plugin spec)
|
|
75
86
|
- Clarified the `LINKEDIN_SEARCH_URL` instruction (no more raw URL parameters like `f_AL=true` — just "open LinkedIn → Jobs, set filters, copy URL")
|
|
76
|
-
- New
|
|
87
|
+
- New maintainer section with a **DigitalTwins.team** call-to-action for custom plugin development
|
|
77
88
|
- `CHANGELOG.md` is now shipped in the npm tarball (added to `package.json#files`), so the npm package page renders release notes next to the README
|
|
78
89
|
- New **Feedback & support** section in the README pointing at a dedicated **Support** node in iLiveMyLife (`0000019dde81b04f-2e534bb8ebad0000`) — users can write directly to the maintainer via the in-graph messenger or `ilml send` from the terminal
|
|
79
90
|
|
package/README.md
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
# Your LinkedIn — finally
|
|
1
|
+
# Your LinkedIn data — finally on your machine
|
|
2
2
|
|
|
3
3
|
LinkedIn keeps your **connections, conversations, and the notes you write about people** locked inside their interface. You can't export message threads. You can't query an AI on your own contact history. You can't run batch operations from a script. You can't keep a personal database of who said what when.
|
|
4
4
|
|
|
5
|
-
This plugin pulls all of that onto your machine and into your [iLiveMyLife](https://ilivemylife.io) knowledge graph
|
|
5
|
+
This plugin pulls all of that onto your machine — into local JSON files that you fully own — and feeds derived signals (action plans, run reports, AI assistant context) into your [iLiveMyLife](https://ilivemylife.io) knowledge graph for AI-driven follow-up. Even if you uninstall the plugin or switch ilml accounts, **your accumulated data stays where you put it**.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Common LinkedIn workflows become scriptable: AI fills Easy Apply forms using context from your profile and notes, drafts message replies for your review before sending, and queues recruiter outreach under daily limits you configure.
|
|
8
|
+
|
|
9
|
+
> **Note on intent and use.** This plugin demonstrates patterns for keeping a local mirror of your own LinkedIn data — syncing message history and connection metadata to JSON files on your machine — and for using AI to assist with form filling and message drafting on your behalf. It is published as a reference implementation for developers building plugins on top of the `ilml` SDK. Automated interaction with LinkedIn may conflict with their [User Agreement](https://www.linkedin.com/legal/user-agreement) — review it and run this at your own risk. Provided AS-IS; the author makes no warranty and accepts no liability for account actions, data loss, or other consequences resulting from use.
|
|
8
10
|
|
|
9
11
|
---
|
|
10
12
|
|
|
11
13
|
## What you get
|
|
12
14
|
|
|
13
|
-
- **A full local mirror of your LinkedIn
|
|
15
|
+
- **A full local mirror of your LinkedIn data.** Connections, conversation threads, message history, profile metadata, your private notes about people — stored in local JSON files you fully own; derived signals (action plans, AI context, run reports) flow into your iLiveMyLife graph for follow-up. Nothing stays trapped in linkedin.com.
|
|
14
16
|
- **AI-assisted messaging — drafts go through you.** [Lifebot](https://ilivemylife.io) reads the full context of each thread (history, your notes, tags) and drafts replies in your voice. You review the batch in one pass and push approved drafts as a group. On push, the bot re-scans every thread first — if a new incoming message arrived since you reviewed, it pauses that draft and flags it for re-review instead of sending blind. Never autopilot.
|
|
15
17
|
- **An auto-triaged inbox.** Every conversation gets classified (recruiter / hiring manager / founder / investor / spam / event), tagged, prioritized, and stamped with a suggested next action. `ilml linkedin today` prints a no-browser daily plan: who to reply to, what to do, in priority order — before you've even opened LinkedIn.
|
|
16
18
|
- **Inbox sync that doesn't break your workflow.** By default `sync-all` pulls the conversation list and metadata without "opening" unread threads — LinkedIn keeps showing the unread badges until *you* read them in the UI. The sync report ends with a list of what's still unread so you can scan it from the terminal first. Use the bot as an analyst without losing your own attention markers. (Pass `--read-unread` if you want to vacuum unread threads into the local DB.)
|
|
17
|
-
- **Terminal-first
|
|
19
|
+
- **Terminal-first workflows.** Common tasks run as scripts you control — batched drafts you review before sending, queued applications under daily limits you set, scheduled runs that log everything. Repeatable and auditable.
|
|
18
20
|
- **Easy Apply that actually thinks.** Auto-fills LinkedIn job applications, with Lifebot answering custom questions ("Why are you interested in this role?") in your voice using context from your graph — not boilerplate.
|
|
19
21
|
- **Your data outlives the plugin.** The connection database, conversation history, and your notes live in a directory **you** choose (`DATA_DIR`). Plugin updates don't wipe them. Logging out of ilml doesn't wipe them. Uninstalling the plugin doesn't wipe them. Only **you** decide when they go.
|
|
20
22
|
|
|
@@ -270,7 +272,7 @@ Between step 1 and step 2: **do not run any `ilml linkedin` command.** The curre
|
|
|
270
272
|
| `~/.ilivemylife/plugins/linkedin/` | Plugin code | yes (re-extracted) | no |
|
|
271
273
|
| `<scope>/.ilivemylife/plugins-state/linkedin.json` | Your configured values (LINKEDIN_NAME, node IDs, etc.) | no | yes (with that scope) |
|
|
272
274
|
| `<scope>/.ilivemylife/plugins-state/linkedin/cookies.json` | LinkedIn session cookies | no | yes (with that scope) |
|
|
273
|
-
| Directory you set as `DATA_DIR` | Local DBs,
|
|
275
|
+
| Directory you set as `DATA_DIR` | Local DBs, synced profile metadata, message history, your notes | **no** | **no** |
|
|
274
276
|
|
|
275
277
|
If you didn't set `DATA_DIR`, runtime data files default to inside the plugin's install dir — meaning a plugin reinstall **wipes them**. Setting `DATA_DIR` to a sibling folder like `~/linkedin-plugin-data/` is **strongly recommended**:
|
|
276
278
|
|
|
@@ -310,13 +312,15 @@ Bug reports, feature requests, and general questions land in the plugin's **Supp
|
|
|
310
312
|
|
|
311
313
|
---
|
|
312
314
|
|
|
313
|
-
##
|
|
314
|
-
|
|
315
|
-
**[Ilya Sorokin](https://www.digitaltwins.team/team/ilya-sorokin)** — creator of [iLiveMyLife.io](https://ilivemylife.io) and this plugin.
|
|
315
|
+
## Maintained by
|
|
316
316
|
|
|
317
|
-
|
|
318
|
-
|
|
317
|
+
[**DigitalTwins.team**](https://www.digitaltwins.team/) — independent
|
|
318
|
+
consultancy that builds and maintains `ilml` plugins, automation tools,
|
|
319
|
+
and bespoke integrations. This plugin is one of several reference
|
|
320
|
+
implementations published as part of that work.
|
|
319
321
|
|
|
320
|
-
|
|
322
|
+
For commercial integrations, custom plugin development, or contract
|
|
323
|
+
engineering inquiries → **info@DigitalTwins.team**.
|
|
321
324
|
|
|
322
|
-
|
|
325
|
+
For bug reports or plugin questions, use the in-graph Support node
|
|
326
|
+
linked above.
|