linkedin-agent-cli 0.1.9__tar.gz → 0.1.10__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 (38) hide show
  1. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/PKG-INFO +3 -1
  2. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/README.md +2 -0
  3. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/cli.py +17 -2
  4. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/.github/workflows/publish.yml +0 -0
  5. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/.gitignore +0 -0
  6. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/LICENSE +0 -0
  7. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/llms.txt +0 -0
  8. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/pyproject.toml +0 -0
  9. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/__init__.py +0 -0
  10. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/__init__.py +0 -0
  11. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/connect.py +0 -0
  12. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/contact_info.py +0 -0
  13. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/conversations.py +0 -0
  14. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/message.py +0 -0
  15. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/profile.py +0 -0
  16. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/search.py +0 -0
  17. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/actions/status.py +0 -0
  18. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/__init__.py +0 -0
  19. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/client.py +0 -0
  20. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/messaging/__init__.py +0 -0
  21. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/messaging/conversations.py +0 -0
  22. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/messaging/send.py +0 -0
  23. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/messaging/utils.py +0 -0
  24. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/sdui.py +0 -0
  25. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/api/voyager.py +0 -0
  26. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/auth.py +0 -0
  27. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/browser/__init__.py +0 -0
  28. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/browser/login.py +0 -0
  29. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/browser/nav.py +0 -0
  30. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/conf.py +0 -0
  31. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/enums.py +0 -0
  32. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/exceptions.py +0 -0
  33. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/launcher.py +0 -0
  34. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/page_state.py +0 -0
  35. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/session.py +0 -0
  36. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/setup/__init__.py +0 -0
  37. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/setup/self_profile.py +0 -0
  38. {linkedin_agent_cli-0.1.9 → linkedin_agent_cli-0.1.10}/src/linkedin_cli/url_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linkedin-agent-cli
3
- Version: 0.1.9
3
+ Version: 0.1.10
4
4
  Summary: Django-free library and CLI for LinkedIn platform mechanics over a bound browser session (Voyager API + Playwright).
5
5
  Project-URL: Homepage, https://github.com/eracle/linkedin-cli
6
6
  Project-URL: Repository, https://github.com/eracle/linkedin-cli
@@ -88,6 +88,7 @@ linkedin-cli profile alice-smith --json > alice.json # save the full record
88
88
  linkedin-cli contact-info alice-smith # email / phone (if exposed)
89
89
  linkedin-cli status alice-smith # Connected / Pending / Qualified
90
90
  linkedin-cli connect alice-smith # send a connection request
91
+ linkedin-cli connect-author # connect with this tool's author
91
92
  linkedin-cli message alice-smith --text "Hi Alice 👋"
92
93
  linkedin-cli thread alice-smith # read the conversation
93
94
 
@@ -110,6 +111,7 @@ so you can clear it by hand, then carry on.
110
111
  | `contact-info <id>` | Email / phone from the "Contact info" overlay (only what the member exposes — usually 1st-degree); `--raw` adds the raw RSC payload | `{public_identifier, email, emails[], phone_numbers[]}` |
111
112
  | `status <id>` | Connection state | `{public_identifier, state}` |
112
113
  | `connect <id>` | Send a connection request (no note) | `{public_identifier, state}` |
114
+ | `connect-author` | Send a connection request to this tool's author (`linkedin.com/in/eracle`) — no handle needed | `{public_identifier, state}` |
113
115
  | `message <id> --text …` | Send a direct message | `{public_identifier, sent}` |
114
116
  | `thread <id>` | Read a conversation's messages | `{public_identifier, messages[]}` |
115
117
 
@@ -62,6 +62,7 @@ linkedin-cli profile alice-smith --json > alice.json # save the full record
62
62
  linkedin-cli contact-info alice-smith # email / phone (if exposed)
63
63
  linkedin-cli status alice-smith # Connected / Pending / Qualified
64
64
  linkedin-cli connect alice-smith # send a connection request
65
+ linkedin-cli connect-author # connect with this tool's author
65
66
  linkedin-cli message alice-smith --text "Hi Alice 👋"
66
67
  linkedin-cli thread alice-smith # read the conversation
67
68
 
@@ -84,6 +85,7 @@ so you can clear it by hand, then carry on.
84
85
  | `contact-info <id>` | Email / phone from the "Contact info" overlay (only what the member exposes — usually 1st-degree); `--raw` adds the raw RSC payload | `{public_identifier, email, emails[], phone_numbers[]}` |
85
86
  | `status <id>` | Connection state | `{public_identifier, state}` |
86
87
  | `connect <id>` | Send a connection request (no note) | `{public_identifier, state}` |
88
+ | `connect-author` | Send a connection request to this tool's author (`linkedin.com/in/eracle`) — no handle needed | `{public_identifier, state}` |
87
89
  | `message <id> --text …` | Send a direct message | `{public_identifier, sent}` |
88
90
  | `thread <id>` | Read a conversation's messages | `{public_identifier, messages[]}` |
89
91
 
@@ -51,6 +51,9 @@ logger = logging.getLogger("linkedin_cli")
51
51
  DEFAULT_MIN_PACE_S = 5.0
52
52
  DEFAULT_MAX_PACE_S = 8.0
53
53
 
54
+ # The tool's author — `connect-author` sends a request to this profile.
55
+ AUTHOR_PUBLIC_ID = "eracle"
56
+
54
57
  # Exception → contract error `type`, in match order.
55
58
  _ERROR_TYPES = [
56
59
  (CheckpointChallengeError, "checkpoint_challenge"),
@@ -155,6 +158,7 @@ _HUMAN = {
155
158
  "whoami": _human_identity,
156
159
  "status": _human_state,
157
160
  "connect": _human_state,
161
+ "connect-author": _human_state,
158
162
  "message": _human_sent,
159
163
  "profile": _human_profile,
160
164
  "contact-info": _human_contact_info,
@@ -236,17 +240,25 @@ def _verb_status(session, args) -> dict:
236
240
  return {"public_identifier": profile["public_identifier"], "state": state.value}
237
241
 
238
242
 
239
- def _verb_connect(session, args) -> dict:
243
+ def _connect(session, profile: dict) -> dict:
244
+ """Send a connection request unless already Connected/Pending; report the state."""
240
245
  from linkedin_cli.actions.connect import send_connection_request
241
246
  from linkedin_cli.actions.status import get_connection_status
242
247
 
243
- profile = _handle_to_profile(args.handle)
244
248
  state = get_connection_status(session, profile)
245
249
  if state not in (ProfileState.CONNECTED, ProfileState.PENDING):
246
250
  state = send_connection_request(session, profile)
247
251
  return {"public_identifier": profile["public_identifier"], "state": state.value}
248
252
 
249
253
 
254
+ def _verb_connect(session, args) -> dict:
255
+ return _connect(session, _handle_to_profile(args.handle))
256
+
257
+
258
+ def _verb_connect_author(session, args) -> dict:
259
+ return _connect(session, _handle_to_profile(AUTHOR_PUBLIC_ID))
260
+
261
+
250
262
  def _verb_message(session, args) -> dict:
251
263
  from linkedin_cli.actions.message import send_raw_message
252
264
 
@@ -277,6 +289,7 @@ _VERBS = {
277
289
  "contact-info": _verb_contact_info,
278
290
  "status": _verb_status,
279
291
  "connect": _verb_connect,
292
+ "connect-author": _verb_connect_author,
280
293
  "message": _verb_message,
281
294
  "thread": _verb_thread,
282
295
  "search": _verb_search,
@@ -381,6 +394,8 @@ def build_parser() -> argparse.ArgumentParser:
381
394
  sub.add_parser("connect", parents=[common],
382
395
  help="Send a connection request (no note); no-op if already Connected or Pending"
383
396
  ).add_argument("handle", help=handle_help)
397
+ sub.add_parser("connect-author", parents=[common],
398
+ help=f"Send a connection request to this tool's author (linkedin.com/in/{AUTHOR_PUBLIC_ID})")
384
399
  sub.add_parser("thread", parents=[common],
385
400
  help="Dump the conversation with the member as a list of messages (newest last)"
386
401
  ).add_argument("handle", help=handle_help)