@hraness/ghostget 0.17.2
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 +458 -0
- package/LICENSE +21 -0
- package/README.md +1359 -0
- package/bunfig.toml +2 -0
- package/dist/apple-photos-client.js +704 -0
- package/dist/beeper-client.js +4602 -0
- package/dist/client.js +1605 -0
- package/dist/index-26yq8q16.js +31 -0
- package/dist/index-9t13b4k7.js +508 -0
- package/dist/index-axwm9b3v.js +5 -0
- package/dist/index-gwk7rbyj.js +30 -0
- package/dist/index.js +701 -0
- package/dist/messaging.js +1130 -0
- package/dist/omni-client.js +1406 -0
- package/dist/whatsapp-client.js +355 -0
- package/docs/imessage-direct-provider.md +106 -0
- package/docs/rental-listings.md +94 -0
- package/package.json +600 -0
- package/skills/ghostget/SKILL.md +251 -0
- package/skills/ghostget/agents/openai.yaml +4 -0
- package/skills/ghostget/references/adapter-contract.md +181 -0
- package/skills/ghostget/references/apple-photos.md +115 -0
- package/skills/ghostget/references/article-drafts.md +235 -0
- package/skills/ghostget/references/code-owned-provider-scaffold.md +134 -0
- package/skills/ghostget/references/cross-posting-video.md +139 -0
- package/skills/ghostget/references/cross-posting.md +82 -0
- package/skills/ghostget/references/derivation.md +390 -0
- package/skills/ghostget/references/hraness-social-profile-stats.json +269 -0
- package/skills/ghostget/references/install.md +66 -0
- package/skills/ghostget/references/linkedin-adapter.md +442 -0
- package/skills/ghostget/references/messaging.md +168 -0
- package/skills/ghostget/references/meta-comet-contract.md +153 -0
- package/skills/ghostget/references/platform-patterns.md +122 -0
- package/skills/ghostget/references/provider-plugins.md +496 -0
- package/skills/ghostget/references/reddit-flair.md +78 -0
- package/skills/ghostget/references/safety-and-state.md +214 -0
- package/skills/ghostget/references/settlement-and-duplicate-cleanup.md +79 -0
- package/skills/ghostget/references/social-platform-routing.md +66 -0
- package/skills/ghostget/references/social-profile-stats.md +195 -0
- package/skills/ghostget/references/social-video-platform-routing.md +89 -0
- package/skills/ghostget/references/whatsapp-adapter.md +101 -0
- package/skills/ghostget/references/x-adapter.md +332 -0
- package/skills/ghostget/references/x-ai-disclosure.md +71 -0
- package/src/apple-photos-cli.ts +639 -0
- package/src/apple-photos-client-types.ts +168 -0
- package/src/apple-photos-client.ts +201 -0
- package/src/apple-photos-contact-evidence.ts +838 -0
- package/src/apple-photos-local-source.ts +1131 -0
- package/src/args.ts +2053 -0
- package/src/article-draft-document.ts +417 -0
- package/src/article-draft-embeds.ts +123 -0
- package/src/article-draft-images.ts +214 -0
- package/src/assets/adapter-template/wrench-adapter.json +40 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.json +1500 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v1.0.0.json +129 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v1.1.0.json +207 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.0.0.json +1463 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.1.0.json +1463 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.2.0.json +1475 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.3.0.json +1488 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.0.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.1.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.2.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.3.0.json +615 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.4.0.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.5.0.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.6.0.json +684 -0
- package/src/assets/adapters/clasificados/wrench-web-adapter.json +54 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.json +750 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.0.0.json +706 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.1.0.json +703 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.2.0.json +750 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.json +682 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.0.0.json +583 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.1.0.json +682 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.json +437 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.0.0.json +383 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.0.json +437 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.1.json +437 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.json +880 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.0.0.json +740 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.1.0.json +880 -0
- package/src/assets/adapters/github/wrench-web-adapter.json +69 -0
- package/src/assets/adapters/github/wrench-web-adapter.v1.0.0.json +42 -0
- package/src/assets/adapters/github/wrench-web-adapter.v1.1.0.json +69 -0
- package/src/assets/adapters/gmail/wrench-adapter.json +161 -0
- package/src/assets/adapters/gmail/wrench-adapter.v1.2.0.json +157 -0
- package/src/assets/adapters/hacker-news/wrench-web-adapter.json +315 -0
- package/src/assets/adapters/hacker-news/wrench-web-adapter.v1.0.0.json +315 -0
- package/src/assets/adapters/imessage/wrench-web-adapter.json +236 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.json +719 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.0.0.json +627 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.1.0.json +609 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.2.0.json +640 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.3.0.json +671 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.4.0.json +710 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.5.0.json +710 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.6.0.json +719 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.7.0.json +719 -0
- package/src/assets/adapters/linkedin/wrench-adapter.json +442 -0
- package/src/assets/adapters/linkedin/wrench-adapter.v0.4.0.json +124 -0
- package/src/assets/adapters/linkedin/wrench-adapter.v1.0.0.json +411 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.json +914 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.0.0.json +604 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.1.0.json +604 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.10.0.json +809 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.11.0.json +809 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.12.0.json +820 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.13.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.14.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.15.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.16.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.17.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.18.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.19.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.2.0.json +731 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.3.0.json +768 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.4.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.5.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.6.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.7.0.json +825 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.8.0.json +792 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.9.0.json +809 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.json +855 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.0.0.json +577 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.1.0.json +604 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.10.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.11.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.12.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.2.0.json +653 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.3.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.4.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.5.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.6.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.7.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.8.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.9.0.json +713 -0
- package/src/assets/adapters/substack/wrench-web-adapter.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.0.0.json +817 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.1.0.json +812 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.2.0.json +812 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.3.0.json +902 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.4.0.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.5.0.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.6.0.json +936 -0
- package/src/assets/adapters/threads/wrench-web-adapter.json +692 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.0.0.json +629 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.1.0.json +623 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.2.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.3.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.4.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.5.0.json +699 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.6.0.json +693 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.7.0.json +692 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.json +762 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.0.0.json +681 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.1.0.json +708 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.2.0.json +762 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.3.0.json +762 -0
- package/src/assets/adapters/twitch/wrench-web-adapter.json +42 -0
- package/src/assets/adapters/twitch/wrench-web-adapter.v1.0.0.json +42 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.json +400 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.0.0.json +355 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.1.0.json +386 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.2.0.json +386 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.3.0.json +400 -0
- package/src/assets/adapters/x/wrench-adapter.json +749 -0
- package/src/assets/adapters/x/wrench-adapter.v1.0.0.json +700 -0
- package/src/assets/adapters/x/wrench-adapter.v1.1.0.json +707 -0
- package/src/assets/adapters/x/wrench-web-adapter.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.1.0.json +579 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.10.0.json +685 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.11.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.12.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.13.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.2.0.json +578 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.3.0.json +610 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.4.0.json +617 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.5.0.json +634 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.6.0.json +632 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.7.0.json +649 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.8.0.json +649 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.9.0.json +683 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.json +561 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.0.0.json +465 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.1.0.json +519 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.2.0.json +561 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.3.0.json +561 -0
- package/src/assets/code-owned-provider-template/plugin.test.ts.template +54 -0
- package/src/assets/code-owned-provider-template/plugin.ts.template +102 -0
- package/src/assets/code-owned-provider-template/runtime.internal.test.ts.template +44 -0
- package/src/assets/code-owned-provider-template/runtime.ts.template +59 -0
- package/src/assets/code-owned-provider-template/wrench-adapter.json.template +33 -0
- package/src/assets/fonts/nebula-sans/LICENSE.txt +96 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
- package/src/assets/fonts/nebula-sans/PROVENANCE.md +14 -0
- package/src/assets.d.ts +4 -0
- package/src/auth.ts +1157 -0
- package/src/beeper-client-types.ts +169 -0
- package/src/beeper-client.ts +250 -0
- package/src/beeper-contact-interactions-cli.ts +180 -0
- package/src/beeper-contact-interactions.ts +1612 -0
- package/src/beeper-message-bundle-v1.ts +257 -0
- package/src/beeper-message-like-me-cli.ts +84 -0
- package/src/beeper-message-like-me-export.ts +2274 -0
- package/src/beeper-message-like-me-recovery.ts +931 -0
- package/src/beeper-message-like-me-source.ts +4034 -0
- package/src/browser-admission.ts +928 -0
- package/src/browser-snapshots.ts +260 -0
- package/src/browser.ts +3873 -0
- package/src/canonical-json.ts +60 -0
- package/src/catalog-cli.ts +638 -0
- package/src/cli.ts +208 -0
- package/src/client-types.ts +301 -0
- package/src/client.ts +2726 -0
- package/src/confirmed-write-failure.ts +44 -0
- package/src/confirmed-write-model.ts +72 -0
- package/src/confirmed-write-platform.ts +1055 -0
- package/src/confirmed-write-program.ts +224 -0
- package/src/confirmed-write-runtime.ts +16 -0
- package/src/cursor-token.ts +228 -0
- package/src/derivation-dnr-readiness.ts +367 -0
- package/src/derivation-file-chooser.ts +384 -0
- package/src/derivation-network-boundary.ts +835 -0
- package/src/derivation-network-guard.ts +782 -0
- package/src/derivation-network-proxy-helper.ts +440 -0
- package/src/derivation-network-proxy.ts +385 -0
- package/src/derive-command-helper.ts +693 -0
- package/src/derive-fixtures.ts +343 -0
- package/src/derive-review.ts +980 -0
- package/src/derive.ts +4754 -0
- package/src/fixtures/beeper-message-like-me-v1/accounts.ndjson +2 -0
- package/src/fixtures/beeper-message-like-me-v1/conversations.ndjson +1 -0
- package/src/fixtures/beeper-message-like-me-v1/manifest.json +1 -0
- package/src/fixtures/beeper-message-like-me-v1/messages.ndjson +2 -0
- package/src/fixtures/beeper-message-like-me-v1/participants.ndjson +3 -0
- package/src/fixtures/beeper-message-like-me-v1/reactions.ndjson +1 -0
- package/src/fixtures/beeper-message-like-me-v1/tombstones.ndjson +1 -0
- package/src/ghostget.ts +3672 -0
- package/src/gmail-capture.ts +1244 -0
- package/src/har-internal.ts +1242 -0
- package/src/har.ts +743 -0
- package/src/index.ts +218 -0
- package/src/invocation-read-platform.ts +55 -0
- package/src/invocation-read-program.ts +93 -0
- package/src/invocation-read-runtime.ts +11 -0
- package/src/linked-device-lifecycle-admission.ts +450 -0
- package/src/linked-device-lifecycle-journal.ts +1560 -0
- package/src/linked-device-lifecycle-runtime.ts +1602 -0
- package/src/local-cli-admission.ts +135 -0
- package/src/local-cli-contracts.ts +271 -0
- package/src/local-cli-execution.ts +98 -0
- package/src/local-cli-surface-contract.ts +1510 -0
- package/src/local-cli-tool-identity.ts +336 -0
- package/src/media/archive.ts +2325 -0
- package/src/media/args.ts +303 -0
- package/src/media/cli.ts +287 -0
- package/src/media/doctor.ts +475 -0
- package/src/media/ffmpeg.ts +1330 -0
- package/src/media/http-capture.ts +711 -0
- package/src/media/http-probe.ts +593 -0
- package/src/media/http.ts +387 -0
- package/src/media/index.ts +10 -0
- package/src/media/local-transcription.ts +613 -0
- package/src/media/lock.ts +321 -0
- package/src/media/manifest.ts +1712 -0
- package/src/media/metadata.ts +906 -0
- package/src/media/process.ts +723 -0
- package/src/media/revision.ts +166 -0
- package/src/media/runtime-closure.ts +1063 -0
- package/src/media/source-router.ts +187 -0
- package/src/media/transcriber-config.ts +1122 -0
- package/src/media/transcript-persistence-model.ts +15 -0
- package/src/media/transcript-persistence-platform.ts +89 -0
- package/src/media/transcript-persistence-program.ts +39 -0
- package/src/media/transcript-persistence-runtime.ts +24 -0
- package/src/media/transcript.ts +616 -0
- package/src/media/utf8-order.ts +30 -0
- package/src/media/whisper-cpp.ts +464 -0
- package/src/media/whisper-language.ts +58 -0
- package/src/media/yt-dlp.ts +439 -0
- package/src/message-like-me-agentic-messaging.ts +882 -0
- package/src/messaging-action-store.ts +793 -0
- package/src/messaging-runtime.ts +2136 -0
- package/src/messaging-store.ts +539 -0
- package/src/messaging-types.ts +1663 -0
- package/src/messaging.ts +334 -0
- package/src/model.ts +2671 -0
- package/src/oauth-google.ts +888 -0
- package/src/omni-client-types.ts +306 -0
- package/src/omni-client.ts +2225 -0
- package/src/omni-limits.ts +34 -0
- package/src/omni-model.ts +1614 -0
- package/src/omni-request.ts +379 -0
- package/src/omni-runtime.ts +1632 -0
- package/src/operation-deadline.ts +189 -0
- package/src/path-helper.ts +1656 -0
- package/src/pinned-https.ts +194 -0
- package/src/plan-assets.ts +832 -0
- package/src/platform-catalog.ts +1832 -0
- package/src/plugins/beeper-linked-device/plugin.ts +310 -0
- package/src/plugins/bluesky-web/plugin.ts +178 -0
- package/src/plugins/clasificados-web/plugin.ts +66 -0
- package/src/plugins/github-web/plugin.ts +80 -0
- package/src/plugins/gmail-official/plugin.ts +110 -0
- package/src/plugins/hacker-news-web/plugin.ts +52 -0
- package/src/plugins/imessage-direct/plugin.ts +195 -0
- package/src/plugins/imessage-direct/vendor/0001-fix-keep-AppleScript-send-payloads-out-of-child-argv.patch +1430 -0
- package/src/plugins/imessage-direct/vendor/0002-feat-rpc-add-exact-chat-lookup.patch +225 -0
- package/src/plugins/imessage-direct/vendor/provenance.json +80 -0
- package/src/plugins/linkedin-official/plugin.ts +84 -0
- package/src/plugins/linkedin-web/plugin.ts +412 -0
- package/src/plugins/meta-web/plugin.ts +317 -0
- package/src/plugins/reddit-web/flair.ts +492 -0
- package/src/plugins/reddit-web/plugin.ts +477 -0
- package/src/plugins/substack-web/plugin.ts +124 -0
- package/src/plugins/tiktok-web/plugin.ts +67 -0
- package/src/plugins/twitch-web/plugin.ts +54 -0
- package/src/plugins/whatsapp-linked-device/plugin.ts +105 -0
- package/src/plugins/x-official/plugin.ts +64 -0
- package/src/plugins/x-web/plugin.ts +488 -0
- package/src/plugins/youtube-web/plugin.ts +101 -0
- package/src/portable-run-recovery.ts +466 -0
- package/src/process-identity.ts +501 -0
- package/src/profile-clone-helper.ts +104 -0
- package/src/provider-catalog-views.ts +51 -0
- package/src/provider-context.ts +69 -0
- package/src/provider-contract-definitions-x.ts +45 -0
- package/src/provider-contract-definitions.ts +948 -0
- package/src/provider-contract-input-gmail.ts +176 -0
- package/src/provider-contract-input-linkedin.ts +77 -0
- package/src/provider-contract-input-x.ts +304 -0
- package/src/provider-contract-planning.ts +23 -0
- package/src/provider-contract-semantic-identity.ts +54 -0
- package/src/provider-contracts.ts +251 -0
- package/src/provider-http.ts +723 -0
- package/src/provider-plugin-auth.ts +36 -0
- package/src/provider-plugin-builtins.ts +229 -0
- package/src/provider-plugin-cleanup-barrier.ts +229 -0
- package/src/provider-plugin-cleanup-execution.ts +79 -0
- package/src/provider-plugin-cleanup-resource.ts +470 -0
- package/src/provider-plugin-contract-identity.ts +707 -0
- package/src/provider-plugin-host.ts +1972 -0
- package/src/provider-plugin-identifiers.ts +60 -0
- package/src/provider-plugin-invocation-lease.ts +889 -0
- package/src/provider-plugin-lifecycle-kernel.ts +566 -0
- package/src/provider-plugin-lifecycle.ts +1455 -0
- package/src/provider-plugin-module-analysis.ts +336 -0
- package/src/provider-plugin-package.ts +2530 -0
- package/src/provider-plugin-portable-authority.ts +106 -0
- package/src/provider-plugin-portable-catalog.ts +94 -0
- package/src/provider-plugin-portable-identity.ts +315 -0
- package/src/provider-plugin-portable-runtime.ts +2057 -0
- package/src/provider-plugin-protocol.ts +1625 -0
- package/src/provider-plugin-registry.ts +3342 -0
- package/src/provider-plugin-store.ts +2155 -0
- package/src/provider-plugin-test-fixture.ts +5 -0
- package/src/provider-plugin.ts +4907 -0
- package/src/provider-plugins.generated.ts +43 -0
- package/src/provider-plugins.ts +8 -0
- package/src/provider-subject.ts +41 -0
- package/src/provider.ts +315 -0
- package/src/providers/beeper-local-runtime.ts +5426 -0
- package/src/providers/beeper-local.ts +2739 -0
- package/src/providers/beeper-messaging.ts +462 -0
- package/src/providers/beeper-omni.ts +1159 -0
- package/src/providers/bluesky-web-runtime.ts +2895 -0
- package/src/providers/bluesky-web.ts +1614 -0
- package/src/providers/clasificados-web-runtime.ts +255 -0
- package/src/providers/clasificados-web.ts +503 -0
- package/src/providers/contact-projection.ts +301 -0
- package/src/providers/github-read-model.ts +94 -0
- package/src/providers/github-read-platform.ts +165 -0
- package/src/providers/github-read-program.ts +97 -0
- package/src/providers/github-web-runtime.ts +320 -0
- package/src/providers/github-web.ts +403 -0
- package/src/providers/gmail-api.ts +2834 -0
- package/src/providers/gmail-omni.ts +830 -0
- package/src/providers/gmail.ts +1130 -0
- package/src/providers/hacker-news-web-runtime.ts +220 -0
- package/src/providers/hacker-news-web.ts +809 -0
- package/src/providers/imessage-direct-install.ts +354 -0
- package/src/providers/imessage-direct-messaging.ts +532 -0
- package/src/providers/imessage-direct-omni.ts +400 -0
- package/src/providers/imessage-direct-runtime.ts +1498 -0
- package/src/providers/imessage-direct.ts +351 -0
- package/src/providers/instagram-video-foundations.ts +913 -0
- package/src/providers/instagram-web-profile-browser.ts +600 -0
- package/src/providers/iso-bmff.ts +338 -0
- package/src/providers/linkedin-company-platform.ts +42 -0
- package/src/providers/linkedin-company-program.ts +88 -0
- package/src/providers/linkedin-contact-failure.ts +84 -0
- package/src/providers/linkedin-contact-platform.ts +45 -0
- package/src/providers/linkedin-contact-program.ts +91 -0
- package/src/providers/linkedin-profile-activity-failure.ts +76 -0
- package/src/providers/linkedin-profile-activity-platform.ts +41 -0
- package/src/providers/linkedin-profile-activity-program.ts +67 -0
- package/src/providers/linkedin-read-failure.ts +52 -0
- package/src/providers/linkedin-self-platform.ts +53 -0
- package/src/providers/linkedin-self-program.ts +122 -0
- package/src/providers/linkedin-web-article-browser.ts +794 -0
- package/src/providers/linkedin-web-bootstrap.ts +146 -0
- package/src/providers/linkedin-web-contact.ts +830 -0
- package/src/providers/linkedin-web-feed-browser.ts +832 -0
- package/src/providers/linkedin-web-feed.ts +864 -0
- package/src/providers/linkedin-web-post-browser.ts +653 -0
- package/src/providers/linkedin-web-profile-browser.ts +683 -0
- package/src/providers/linkedin-web-runtime.ts +2388 -0
- package/src/providers/linkedin-web.ts +3305 -0
- package/src/providers/linkedin.ts +1885 -0
- package/src/providers/meta-bootstrap.ts +1043 -0
- package/src/providers/meta-facebook-group.ts +690 -0
- package/src/providers/meta-marketplace-relay.ts +747 -0
- package/src/providers/meta-omni.ts +373 -0
- package/src/providers/meta-relay-bundle.ts +1049 -0
- package/src/providers/meta-web-descriptors.ts +1740 -0
- package/src/providers/meta-web-runtime.ts +3388 -0
- package/src/providers/meta-web.ts +2931 -0
- package/src/providers/read-failure.ts +139 -0
- package/src/providers/reddit-omni.ts +462 -0
- package/src/providers/reddit-web-runtime.ts +1929 -0
- package/src/providers/reddit-web.ts +1611 -0
- package/src/providers/rental-listings.ts +460 -0
- package/src/providers/substack-omni.ts +406 -0
- package/src/providers/substack-video-mp4.ts +33 -0
- package/src/providers/substack-web-runtime.ts +2812 -0
- package/src/providers/substack-web.ts +1502 -0
- package/src/providers/tiktok-video-mp4.ts +33 -0
- package/src/providers/tiktok-web-runtime.ts +770 -0
- package/src/providers/tiktok-web.ts +2786 -0
- package/src/providers/twitch-web-runtime.ts +226 -0
- package/src/providers/twitch-web.ts +274 -0
- package/src/providers/whatsapp-account-identity.ts +55 -0
- package/src/providers/whatsapp-contact-projection-helper.ts +874 -0
- package/src/providers/whatsapp-contact-projection-protocol.ts +403 -0
- package/src/providers/whatsapp-interaction-projection-helper.ts +1452 -0
- package/src/providers/whatsapp-interaction-projection-protocol.ts +462 -0
- package/src/providers/whatsapp-message-export-projection-protocol.ts +532 -0
- package/src/providers/whatsapp-messaging.ts +132 -0
- package/src/providers/whatsapp-omni.ts +586 -0
- package/src/providers/whatsapp-web-runtime.ts +3108 -0
- package/src/providers/whatsapp-web.ts +1037 -0
- package/src/providers/x-image-provenance.ts +523 -0
- package/src/providers/x-made-with-ai.ts +106 -0
- package/src/providers/x-transaction-id.ts +413 -0
- package/src/providers/x-web-runtime.ts +3485 -0
- package/src/providers/x-web.ts +2332 -0
- package/src/providers/x.ts +1889 -0
- package/src/providers/youtube-web-runtime.ts +1400 -0
- package/src/providers/youtube-web.ts +1221 -0
- package/src/read-admission-runtime.ts +91 -0
- package/src/read-client.ts +521 -0
- package/src/read-effect-platform.ts +7 -0
- package/src/read-effect-runtime.ts +14 -0
- package/src/read-effect.ts +52 -0
- package/src/read-projection-admission.ts +866 -0
- package/src/read-projections.ts +3151 -0
- package/src/recovery.ts +1492 -0
- package/src/reviewed-template.ts +146 -0
- package/src/run-journal.ts +1272 -0
- package/src/runtime.ts +5116 -0
- package/src/scripts/generate-provider-plugin-catalog.ts +121 -0
- package/src/scripts/install-whatsapp-protocol.sh +232 -0
- package/src/scripts/recover-install-stages.ts +1491 -0
- package/src/scripts/resolve-state-home.ts +30 -0
- package/src/scripts/scaffold-web-provider.ts +973 -0
- package/src/scripts/sync-bundled-adapters.ts +695 -0
- package/src/session-secrets.ts +1183 -0
- package/src/state-helper.bunfig.toml +2 -0
- package/src/state-helper.ts +2914 -0
- package/src/storage.ts +3842 -0
- package/src/transport-policy.ts +2 -0
- package/src/usage.ts +182 -0
- package/src/version.ts +2 -0
- package/src/web-session-authentication-policy.ts +136 -0
- package/src/web-session-cleanup-admission.ts +2344 -0
- package/src/web-session-cleanup-join.ts +99 -0
- package/src/web-session-client.ts +996 -0
- package/src/web-session-contract-definitions.ts +820 -0
- package/src/web-session-contract-planning.ts +42 -0
- package/src/web-session-contracts.ts +228 -0
- package/src/web-session-cookies.ts +500 -0
- package/src/web-session-execution.ts +385 -0
- package/src/web-session-http.ts +373 -0
- package/src/web-session-read-errors.ts +19 -0
- package/src/web-session-read-runtime.ts +124 -0
- package/src/web-session-recovery.ts +818 -0
- package/src/web-session-sites.ts +58 -0
- package/src/web-session-template.ts +994 -0
- package/src/web-session.ts +93 -0
- package/src/whatsapp-client-binding.ts +21 -0
- package/src/whatsapp-client-types.ts +75 -0
- package/src/whatsapp-client.ts +395 -0
- package/src/whatsapp-export-coordinate.ts +17 -0
- package/src/whatsapp-message-bundle-v2.ts +195 -0
- package/src/whatsapp-message-like-me-cli.ts +195 -0
- package/src/whatsapp-message-like-me-export.ts +1072 -0
- package/src/whatsapp-message-like-me-source.ts +1012 -0
- package/tsconfig.json +67 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Install and diagnose Ghostget
|
|
2
|
+
|
|
3
|
+
Use this reference only when `ghostget` is unavailable or `ghostget doctor`
|
|
4
|
+
reports a dependency needed by the requested workflow.
|
|
5
|
+
|
|
6
|
+
## Install the CLI
|
|
7
|
+
|
|
8
|
+
Ghostget requires Bun 1.3.14 or newer and supports macOS and Linux. Check both
|
|
9
|
+
commands before changing the machine:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
command -v bun
|
|
13
|
+
command -v ghostget
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
If Bun is missing, stop and direct the user to the official
|
|
17
|
+
[Bun installation guide](https://bun.sh/docs/installation). Do not switch
|
|
18
|
+
package managers or pipe an unreviewed installer into a shell.
|
|
19
|
+
|
|
20
|
+
This reference is authored for the exact v0.17.2 release coordinate. Use it
|
|
21
|
+
only from the matching release-bound Agent Skill after its canonical archive and
|
|
22
|
+
immutable GitHub Release exist. If the coordinate is not public, stop instead
|
|
23
|
+
of substituting `main`, another tag, or a different package version. Install
|
|
24
|
+
that exact release and its reviewed bundled adapter manifests:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
bun add --global https://github.com/hraness/ghostget/releases/download/v0.17.2/hraness-ghostget-0.17.2.tgz
|
|
28
|
+
ghostget adapter sync-bundled --json
|
|
29
|
+
ghostget --help
|
|
30
|
+
ghostget doctor --json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The package is `@hraness/ghostget`; `@hraness/ghostget@0.17.2` is an optional npm
|
|
34
|
+
mirror only after verified registry publication. Canonical installation does not
|
|
35
|
+
wait for registry publication.
|
|
36
|
+
|
|
37
|
+
When upgrading from Wrench, use `ghostget` for new commands and
|
|
38
|
+
`GHOSTGET_STATE_HOME` for an explicit state root. Existing state is selected in
|
|
39
|
+
place; do not rename, copy, or delete a state directory as part of the upgrade.
|
|
40
|
+
The [migration guide](https://github.com/hraness/ghostget/blob/v0.17.2/docs/ghostget-migration.md)
|
|
41
|
+
explains the retained state aliases and durable protocol names.
|
|
42
|
+
|
|
43
|
+
Do not clone the repository merely to run the CLI. Importing the SDK is a
|
|
44
|
+
separate project dependency and does not install a global command:
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
bun add https://github.com/hraness/ghostget/releases/download/v0.17.2/hraness-ghostget-0.17.2.tgz
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`ghostget adapter sync-bundled` upgrades exact bundled baselines, including an
|
|
51
|
+
older generation whose bytes later drifted, and preserves independently
|
|
52
|
+
modified current or newer manifests that this CLI can execute. If an installed
|
|
53
|
+
source-owned bundled manifest was generated by an incompatible Ghostget release,
|
|
54
|
+
sync atomically repairs it with this release's contract and emits a warning.
|
|
55
|
+
Install the intended Ghostget release again to restore that release's newer
|
|
56
|
+
contracts. This prevents one incompatible manifest from disabling an entire
|
|
57
|
+
adapter while still preserving compatible current or newer custom installs.
|
|
58
|
+
|
|
59
|
+
## Add only required optional tools
|
|
60
|
+
|
|
61
|
+
Treat `ghostget doctor --json` as the capability report. Install a browser,
|
|
62
|
+
`yt-dlp`, FFmpeg, a local transcription runtime, a provider-specific helper,
|
|
63
|
+
or another operating-system dependency only when the requested route needs
|
|
64
|
+
it and the user has authorized that machine change. Re-run doctor after the
|
|
65
|
+
install. Do not weaken a provider or archive boundary when an optional tool is
|
|
66
|
+
absent.
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
# LinkedIn authenticated web API adapter
|
|
2
|
+
|
|
3
|
+
The current `linkedin-web` schema-v4 adapter has six observed operations:
|
|
4
|
+
`profiles.read@1`, `organizations.read@1`, `contacts.read@1`, `feeds.read@2`,
|
|
5
|
+
`articles.draft.save@7`, and `posts.publish@3`. The two profile-stat operations
|
|
6
|
+
bind the current member, then read one exact self profile or requested
|
|
7
|
+
organization Page without DOM automation. `contacts.read@1` reads Contact info
|
|
8
|
+
for one exact 1st-degree connection profile through the same contained Chrome
|
|
9
|
+
session. `feeds.read@2` pages one member's
|
|
10
|
+
recent-activity posts through the same contained Chrome session: it binds the
|
|
11
|
+
signed-in viewer, resolves the live `voyagerFeedDashProfileUpdates` query on
|
|
12
|
+
`/in/{vanity}/recent-activity/all/`, and projects authored text, engagement
|
|
13
|
+
counts when present, original-versus-reshare kind, and an opaque next cursor.
|
|
14
|
+
`feed=home` remains capture-required and is refused before any browser starts.
|
|
15
|
+
The draft operation creates or replaces one private native Article
|
|
16
|
+
draft for the bound current member, supports paragraphs, H1/H2 headings, native blockquotes,
|
|
17
|
+
native HTTPS links, one distinct banner cover, and ordered inline images with
|
|
18
|
+
required alt text and optional captions, and independently verifies the exact unpublished result
|
|
19
|
+
from the authenticated editor-page server payload. The post operation publishes
|
|
20
|
+
one confirmed text post with an optional single plan-bound PNG, stages real-size
|
|
21
|
+
image bytes in bounded ordered contained-browser commands, binds the exact
|
|
22
|
+
member and returned share, durably retains that accepted share target, and
|
|
23
|
+
verifies an independent exact-share readback.
|
|
24
|
+
Every other consumer-web capability remains `capture-required` and inert.
|
|
25
|
+
|
|
26
|
+
A browser may record a managed HAR, bootstrap the private session, or resolve
|
|
27
|
+
current session material. Runtime draft saving executes only Ghostget's fixed
|
|
28
|
+
reviewed first-party API/write and editor-response readback contract inside a contained headed Chrome session;
|
|
29
|
+
LinkedIn rejects the same editor exchange from a standalone HTTP client after
|
|
30
|
+
its initial authenticated probe. It never types into or reads the Article
|
|
31
|
+
editor DOM. Callers cannot choose a URL, header, script, or selector. Ghostget
|
|
32
|
+
never lists an inbox, opens a conversation, sends a message, or performs
|
|
33
|
+
another semantic action through LinkedIn's DOM.
|
|
34
|
+
|
|
35
|
+
First-party traffic is not the same as a documented public API. Use this local client only with the user's account authority, comply with applicable provider rules, and keep bulk outreach and engagement outside ghostget.
|
|
36
|
+
|
|
37
|
+
## Contents
|
|
38
|
+
|
|
39
|
+
- [Install and inspect](#install-and-inspect)
|
|
40
|
+
- [Configure the signed-in realm](#configure-the-signed-in-realm)
|
|
41
|
+
- [Recapture inbox listing](#recapture-inbox-listing)
|
|
42
|
+
- [1st-degree Contact info](#1st-degree-contact-info)
|
|
43
|
+
- [Native Article draft saving](#native-article-draft-saving)
|
|
44
|
+
- [Resolve current LinkedIn material](#resolve-current-linkedin-material)
|
|
45
|
+
- [Preserve capture-required operations](#preserve-capture-required-operations)
|
|
46
|
+
- [Risk and confirmation](#risk-and-confirmation)
|
|
47
|
+
- [Recapture on drift](#recapture-on-drift)
|
|
48
|
+
|
|
49
|
+
## Install and inspect
|
|
50
|
+
|
|
51
|
+
Validate the reviewed manifest before installation:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
ghostget adapter validate src/assets/adapters/linkedin/wrench-web-adapter.json
|
|
55
|
+
ghostget adapter install src/assets/adapters/linkedin/wrench-web-adapter.json
|
|
56
|
+
ghostget capabilities linkedin-web --json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Treat capability state as authoritative. `observed` means the exact contract version is eligible to execute after its account and current-session preflight passes. `capture-required` means the operation is reserved but unavailable; it performs no request and has no browser fallback.
|
|
60
|
+
|
|
61
|
+
The separate `linkedin` adapter uses LinkedIn's documented OAuth API for approved post, comment, reply, repost, and reaction scopes. It does not supply the consumer Home feed or consumer inbox. Keep its OAuth token and preview separate from the `linkedin-web` cookie realm, and never switch transports silently.
|
|
62
|
+
|
|
63
|
+
## Configure the signed-in realm
|
|
64
|
+
|
|
65
|
+
LinkedIn currently rejects exported session cookies outside their browser
|
|
66
|
+
context. Configure profile statistics with a path-backed, dormant Chrome
|
|
67
|
+
profile and the exact Chrome executable. A filtered cookie source may overlay
|
|
68
|
+
fresh origin-scoped cookies when the source browser is running:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
ghostget auth add linkedin-main \
|
|
72
|
+
--browser-profile /absolute/private/chrome-snapshot/Default \
|
|
73
|
+
--browser-executable "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
|
|
74
|
+
--trust-profile-egress \
|
|
75
|
+
--cookie-source chrome \
|
|
76
|
+
--cookie-profile "Profile 2"
|
|
77
|
+
ghostget auth bind linkedin-main --site linkedin
|
|
78
|
+
ghostget auth list --json
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The profile path grants its contained page scripts unfiltered public-host
|
|
82
|
+
egress and may contain every signed-in session in that browser profile. Keep it
|
|
83
|
+
private, outside the repository, and use it only with the user's informed
|
|
84
|
+
authority. Ghostget refuses to clone an active Chromium user-data root. For a
|
|
85
|
+
scheduled realm, first load LinkedIn normally in the selected source profile
|
|
86
|
+
and confirm that its first-party session is current. Fully quit Chrome, take
|
|
87
|
+
one private snapshot, then point the auth locator at that dormant snapshot and
|
|
88
|
+
use the filtered cookie overlay for current session values. The overlay can
|
|
89
|
+
refresh valid cookies, but it cannot revive a source session that LinkedIn
|
|
90
|
+
already rejects with 401. Never attach the runtime operation to a live inbox
|
|
91
|
+
tab or copy LinkedIn session material into an OAuth token document.
|
|
92
|
+
|
|
93
|
+
Bind `linkedin-main` to one stable current member/person identity before private
|
|
94
|
+
reads or mutations. The observed organization Page read remains a
|
|
95
|
+
member-authenticated view and does not select an organization actor. A future
|
|
96
|
+
organization mutation must bind that actor separately and prove that the
|
|
97
|
+
current member can act for it. Reject account ambiguity, login changes,
|
|
98
|
+
request-actor mismatch, and response-actor mismatch before dispatch.
|
|
99
|
+
|
|
100
|
+
The retained candidate parser derives a mailbox only when the current-account
|
|
101
|
+
response directly names one bounded `miniProfile` reference and exactly one
|
|
102
|
+
included entity binds that reference to the same numeric member subject. It
|
|
103
|
+
does not scan other included profile entities as a fallback. Missing,
|
|
104
|
+
unbound, conflicting, or ambiguous direct bindings fail.
|
|
105
|
+
|
|
106
|
+
The standalone client can strictly review a short-lived `__cf_bm` edge-cookie
|
|
107
|
+
rotation: it accepts only that name, validates origin, attributes, expiry, and
|
|
108
|
+
deletion semantics, and binds the encrypted cache to the auth-locator hash.
|
|
109
|
+
Removing the auth locator removes that cache. Profile-backed statistics do not
|
|
110
|
+
export their session into that standalone client. Only the six observed
|
|
111
|
+
operations may cross the execution boundary; every capture-required operation
|
|
112
|
+
still refuses before its provider client is created.
|
|
113
|
+
|
|
114
|
+
Verification on July 23, 2026 produced a durable projection-drift failure and
|
|
115
|
+
every available LinkedIn realm returned `401` at current-account preflight.
|
|
116
|
+
That remains negative evidence for the independently capture-required inbox
|
|
117
|
+
contracts, not a demotion of the separately observed profile and Page reads.
|
|
118
|
+
Reauthentication alone does not promote an inbox contract; a fresh low-stakes
|
|
119
|
+
capture must also prove its current identity, mailbox, query, response
|
|
120
|
+
projection, and completeness semantics.
|
|
121
|
+
|
|
122
|
+
## Recapture inbox listing
|
|
123
|
+
|
|
124
|
+
`messaging.list` is a capture-required reservation. Version 1.1.0 remains
|
|
125
|
+
archived as historical evidence of the formerly observed bundle; version
|
|
126
|
+
1.2.0 first demoted it, and version 1.7.0 preserves that unavailable contract
|
|
127
|
+
history. The current bundle remains capture-required and cannot execute. The
|
|
128
|
+
intended folder input still reserves:
|
|
129
|
+
|
|
130
|
+
- `focused` for the main inbox;
|
|
131
|
+
- `other` for the additional inbox;
|
|
132
|
+
- `requests` for pending message requests;
|
|
133
|
+
- `archive`;
|
|
134
|
+
- `spam`;
|
|
135
|
+
- `all` for conversations in the returned inbox page.
|
|
136
|
+
|
|
137
|
+
The prior candidate projected bounded conversation identity, participants,
|
|
138
|
+
latest-message preview, read metadata, and an opaque sync token. Those shapes
|
|
139
|
+
are retained for comparison, not claimed as current. A new capture must prove
|
|
140
|
+
folder classification, whether continuation is executable, when a page is
|
|
141
|
+
complete, and the exclusion of presence, delivery acknowledgements,
|
|
142
|
+
seen/read receipts, and notification-badge requests. An inbox preview must not
|
|
143
|
+
be described as full conversation history.
|
|
144
|
+
|
|
145
|
+
Inspect the reservations without executing them:
|
|
146
|
+
|
|
147
|
+
```sh
|
|
148
|
+
ghostget capabilities linkedin-web --json
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Captured evidence identifies article, feed, mailbox-count, secondary-inbox,
|
|
152
|
+
conversation-list, and message endpoint families. Every family remains
|
|
153
|
+
capture-required until its current variables, bounded target-bound projection,
|
|
154
|
+
completeness, and incidental effects are proved. Reading a conversation must
|
|
155
|
+
use only a reviewed message query and must not mark it read.
|
|
156
|
+
|
|
157
|
+
## Profile activity posts
|
|
158
|
+
|
|
159
|
+
`feeds.read@2` is an observed R1 read for one page of a member's
|
|
160
|
+
`/in/{vanity}/recent-activity/all/` posts. It does not require official OAuth
|
|
161
|
+
`posts.read` or `w_member_social`. Use a path-backed Chrome profile or a
|
|
162
|
+
cookie-source overlay that is already signed into LinkedIn. The operation
|
|
163
|
+
always uses contained headed Chrome; a standalone exported-cookie HTTP client
|
|
164
|
+
is not a fallback.
|
|
165
|
+
|
|
166
|
+
Pass `feed=profile-activity` plus one `profile_url` or `vanity`. The URL may
|
|
167
|
+
be the public profile or the recent-activity path. An opaque `cursor` from the
|
|
168
|
+
previous page continues the same vanity. `limit` is 1–100 and defaults to 20.
|
|
169
|
+
`feed=home` stays reserved and refuses before the browser starts.
|
|
170
|
+
|
|
171
|
+
The page binds the signed-in viewer to the auth subject, then observes exactly
|
|
172
|
+
one live `voyagerFeedDashProfileUpdates.<32-hex>` query and one target profile
|
|
173
|
+
URN. Zero or several hashes fail closed. Each item projects the activity URN,
|
|
174
|
+
canonical feed URL, author vanity or URN when present, full commentary text,
|
|
175
|
+
created or relative time when present, reaction/comment/repost counts when
|
|
176
|
+
LinkedIn supplies them, media presence, and original-versus-reshare kind.
|
|
177
|
+
Missing counts stay `null`; the runtime never invents zero. A next cursor is
|
|
178
|
+
returned only when paging includes a strictly advancing `rel=next` link, or
|
|
179
|
+
when `paging.total` is a positive count still above `start + count`. LinkedIn's
|
|
180
|
+
current profile-activity page sends `{count, start, total: 0}` with no next
|
|
181
|
+
link; that page is complete and does not invent an offset from a full page.
|
|
182
|
+
When LinkedIn omits paging, `complete` stays false and `nextCursor` is `null`.
|
|
183
|
+
Contradictory paging or a provider page larger than `limit` fails closed.
|
|
184
|
+
|
|
185
|
+
```sh
|
|
186
|
+
printf '%s' '{"feed":"profile-activity","profile_url":"https://www.linkedin.com/in/j-hawkins/","limit":20}' \
|
|
187
|
+
| ghostget invoke linkedin-web feeds.read --input - --auth linkedin-main --json
|
|
188
|
+
printf '%s' '{"feed":"profile-activity","vanity":"varunr96","cursor":"<opaque>","limit":20}' \
|
|
189
|
+
| ghostget invoke linkedin-web feeds.read --input - --auth linkedin-main --json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Do not treat this page as a complete profile history, a home feed, or
|
|
193
|
+
permission to like, comment, or message.
|
|
194
|
+
|
|
195
|
+
## Profiles, organization Pages, and connections
|
|
196
|
+
|
|
197
|
+
`profiles.read@1` is an observed R1 read for one exact signed-in self profile
|
|
198
|
+
URL. It binds the current member to the requested public slug and projects the
|
|
199
|
+
exact follower count. When `include_connections` is true, it also reads the
|
|
200
|
+
exact private My Network connection total in the same ordered browser
|
|
201
|
+
transport. `organizations.read@1` is an observed R1 read for one exact company
|
|
202
|
+
Page URL. It binds the requested company record and its matching following
|
|
203
|
+
state before projecting the exact follower count. Viewing a Page does not
|
|
204
|
+
confer Page-actor authority.
|
|
205
|
+
|
|
206
|
+
For a path-backed auth realm, Ghostget starts a task-private contained clone and
|
|
207
|
+
uses the browser path before any standalone cookie preflight. One code-owned
|
|
208
|
+
evaluation derives the reviewed CSRF header from the unique `JSESSIONID` and
|
|
209
|
+
performs exact `GET /voyager/api/me`. After binding that response to the auth
|
|
210
|
+
subject and requested self slug, it reads the exact profile response and, when
|
|
211
|
+
requested, the private connections response in order. The organization branch
|
|
212
|
+
instead reads only the exact requested Page after the same member binding.
|
|
213
|
+
Every response is bounded, same-origin, exact-route, status- and media-type
|
|
214
|
+
checked before projection. Login, checkpoint, redirect, network, cookie,
|
|
215
|
+
identity, target, or response drift fails closed. Ghostget does not click or
|
|
216
|
+
inspect LinkedIn DOM, expose a caller-selected selector or script, follow a
|
|
217
|
+
redirect, or retry after an arbitrary browser failure. It closes the contained
|
|
218
|
+
browser and verifies cleanup after success or failure.
|
|
219
|
+
|
|
220
|
+
Live evidence on August 23, 2026 showed that LinkedIn returned deletion
|
|
221
|
+
cookies for a valid `li_at` when the same Chrome session was replayed through a
|
|
222
|
+
standalone client, even with Chrome's normal request headers. A cookie-only
|
|
223
|
+
realm is therefore not the scheduled profile-stat transport. The path-backed
|
|
224
|
+
browser branch preserves the browser/device context while still keeping the
|
|
225
|
+
operation fixed and target-bound.
|
|
226
|
+
|
|
227
|
+
## 1st-degree Contact info
|
|
228
|
+
|
|
229
|
+
`contacts.read@1` is an observed R1 read for one exact 1st-degree connection
|
|
230
|
+
profile URL. It binds the signed-in viewer, then requires a 1st-degree
|
|
231
|
+
relationship on that vanity from the profile page. Current LinkedIn pages are
|
|
232
|
+
SDUI/RSC and often omit classic `bpr-guid-*` Profile embeds. The binder
|
|
233
|
+
therefore walks both those Voyager code payloads and `window.__como_rehydration__`,
|
|
234
|
+
and treats `memberDistance`, `networkDistance`, or `distance` of `DISTANCE_1`,
|
|
235
|
+
`1`, or `"1"` as first-degree when that value is joined to the requested vanity
|
|
236
|
+
or its profile URN.
|
|
237
|
+
|
|
238
|
+
When the same page already embeds Contact-info fields, including a labeled
|
|
239
|
+
Email row, the operation projects those fields and does not issue a second
|
|
240
|
+
fetch. Otherwise it GETs `/voyager/api/graphql` for
|
|
241
|
+
`voyagerIdentityDashProfileContactInfo`, using a page-resolved `queryId` when
|
|
242
|
+
the HTML contains exactly one decorated revision and `queryName` otherwise.
|
|
243
|
+
Variables are exactly `(profileUrn:{urn})`. Classic
|
|
244
|
+
`/voyager/api/identity/profiles/{vanity}/profileContactInfo` now returns HTTP
|
|
245
|
+
410 and is rejected. The executable contract is that reviewed first-party GET
|
|
246
|
+
or the page-embedded fields, not a caller-selected RSC body, DOM click, or
|
|
247
|
+
selector. Ghostget does not message, connect, or InMail.
|
|
248
|
+
|
|
249
|
+
The projection returns `email` when LinkedIn shows it, plus any of the vanity
|
|
250
|
+
profile link, connected-since date, phone numbers, websites, and birthday.
|
|
251
|
+
Completeness is `complete` when at least one of those optional fields is
|
|
252
|
+
present and `partial` when the payload bound but LinkedIn omitted every
|
|
253
|
+
optional field.
|
|
254
|
+
|
|
255
|
+
A 2026-09-08 signed-in capture of a 1st-degree profile showed the Contact info
|
|
256
|
+
control on the intro card and a modal with the vanity link, Email, and
|
|
257
|
+
Connected since. The same capture had Como rehydration with numeric
|
|
258
|
+
`networkDistance: 1`, a `ProfileContactDetailsOverlay` screen, and no
|
|
259
|
+
`bpr-guid-*` Profile records. Voyager `profileContactInfo`, `networkinfo`, and
|
|
260
|
+
`profileView` returned 410. That drift is why the binder and fetch path
|
|
261
|
+
changed.
|
|
262
|
+
|
|
263
|
+
Self profiles fail closed with guidance to use `profiles.read`. Second-degree,
|
|
264
|
+
third-degree, and out-of-network profiles fail closed because LinkedIn hid
|
|
265
|
+
Contact info from that viewer. The operation never invents a hidden email.
|
|
266
|
+
|
|
267
|
+
```sh
|
|
268
|
+
printf '%s' '{"profile_url":"https://www.linkedin.com/in/example/"}' \
|
|
269
|
+
| ghostget invoke linkedin-web contacts.read --input - --auth linkedin-main --json
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
`relationships.recommendations.read` and `relationships.connect` remain
|
|
273
|
+
`capture-required`. The former reserves one bounded R1 page from the `all`
|
|
274
|
+
recommended-connections surface. The latter reserves one R3 invitation to an
|
|
275
|
+
exact profile URN, with an optional note of at most 300 characters and a
|
|
276
|
+
24-hour local-at-most-once window. Neither performs a request before a managed
|
|
277
|
+
HAR proves its exact request, viewer scope, target, response, paging,
|
|
278
|
+
completeness, and duplicate-state behavior.
|
|
279
|
+
|
|
280
|
+
Do not treat `organizations.read` as organization-actor authority. A future
|
|
281
|
+
Page-authored post or comment must separately bind the current member, selected
|
|
282
|
+
organization actor, administered-role entitlement, request actor, and returned
|
|
283
|
+
actor. `comments.create` targets an exact post URN; LinkedIn does not have a
|
|
284
|
+
separate ghostget operation for “commenting on a profile” or “commenting on a
|
|
285
|
+
Page.” A member- or organization-authored post remains the comment target.
|
|
286
|
+
|
|
287
|
+
## Native Article draft saving
|
|
288
|
+
|
|
289
|
+
`articles.draft.save` is an observed R2 operation for one private native
|
|
290
|
+
LinkedIn Article draft. Its input uses the canonical provider-neutral
|
|
291
|
+
`ArticleDraftDocument` described in [native article drafts](article-drafts.md),
|
|
292
|
+
with an optional exact existing `draft_id`. The current contract accepts
|
|
293
|
+
paragraph, `heading1`, `heading2`, and `blockquote` blocks, native HTTPS link ranges, and
|
|
294
|
+
one separate plan-bound JPEG, PNG, or WebP cover on create, or preserves the
|
|
295
|
+
independently read existing banner on an exact replacement when `cover_image`
|
|
296
|
+
is omitted, plus 1–20 ordered inline images up to 5 MiB each. Every inline image requires descriptive alt text and
|
|
297
|
+
may have a caption. The cover is outer input rendered only in the banner slot;
|
|
298
|
+
it is never a document body block. Styles, list items, proprietary embeds,
|
|
299
|
+
HTML, Markdown, and editor payloads are rejected. The caller owns editorial
|
|
300
|
+
translation, image placement, captions, and alt text.
|
|
301
|
+
|
|
302
|
+
When the source Article contains an X status, use
|
|
303
|
+
`projectXStatusArticleEmbed` with the `linkedin-web` target. The reviewed
|
|
304
|
+
LinkedIn contract emits the exact status text as native blockquotes followed
|
|
305
|
+
immediately by one canonical linked X URL.
|
|
306
|
+
Omit source-post chrome, metrics, and card screenshots by default.
|
|
307
|
+
|
|
308
|
+
On August 18, 2026, an authorized private draft create and editor reload
|
|
309
|
+
independently returned the same text block as provider type `QUOTE`; this
|
|
310
|
+
reviewed shape is the evidence for `blockquote` write and readback support.
|
|
311
|
+
|
|
312
|
+
Create first binds a private title shell and its exact current-author
|
|
313
|
+
unpublished readback, registers, transfers, binds, and verifies the cover,
|
|
314
|
+
then registers and transfers each inline image before saving and reading back
|
|
315
|
+
the complete document. Replacement reads the exact private draft, performs
|
|
316
|
+
the same distinct cover and inline-image steps, then performs one conservative
|
|
317
|
+
title/document replacement. Neither schedule contains a publication or
|
|
318
|
+
feed-share request.
|
|
319
|
+
|
|
320
|
+
The contained browser is an authenticated transport, not a browser-operation
|
|
321
|
+
fallback. Chrome supplies the bound device session, cookies, user agent, and
|
|
322
|
+
TLS context; code-owned evaluation sends only the fixed current-member,
|
|
323
|
+
create, distinct cover/inline image registrations, signed byte transfers,
|
|
324
|
+
exact editor-page readback, cover-autosave, title-autosave, and
|
|
325
|
+
content-autosave requests.
|
|
326
|
+
The headed window may be visible during the save. Cleanup is tracked as part
|
|
327
|
+
of the durable operation and an unverified close preserves private artifacts
|
|
328
|
+
for explicit recovery instead of silently deleting evidence.
|
|
329
|
+
|
|
330
|
+
Authorized August 15–16, 2026 captures proved the current first-party Article
|
|
331
|
+
route family, exact create and partial-update bodies, the returned Rest.li
|
|
332
|
+
draft identity, normalized current-member-to-Article-author binding, private
|
|
333
|
+
`DRAFT` lifecycle, null publication/share fields, exact title/content/link
|
|
334
|
+
projection, and persistence after reopening. The August 16 live recapture also
|
|
335
|
+
proved that exact draft reads now come from one bounded hidden JSON payload in
|
|
336
|
+
the authenticated editor HTML response rather than the retired Rest.li finder.
|
|
337
|
+
The August 16 inline-image capture additionally proved bounded still-image
|
|
338
|
+
registration, a signed transfer returning `201`, stable asset-URN projection,
|
|
339
|
+
ordered image blocks, required accessibility text, optional captions,
|
|
340
|
+
provider-restored CDN sources, and persistence after reopening. The editor
|
|
341
|
+
proceeded directly from transfer to Article autosave and made no processing
|
|
342
|
+
status poll, so Ghostget follows that exact sequence and gates success on the
|
|
343
|
+
later private Article response and independent readback.
|
|
344
|
+
|
|
345
|
+
An August 18 recapture after registration drift proved the current
|
|
346
|
+
`PUBLISHING_INLINE_IMAGE` response uses LinkedIn's bounded single-upload
|
|
347
|
+
variant. Ghostget accepts that exact known-field family and the prior vector
|
|
348
|
+
variant, but still rejects multipart mechanisms, unknown response fields,
|
|
349
|
+
unreviewed headers, and upload targets outside the fixed LinkedIn origin and
|
|
350
|
+
path. File selection in the editor's preview dialog was not upload completion:
|
|
351
|
+
the reviewed flow selected the staged image, advanced the dialog once, waited
|
|
352
|
+
for the signed transfer, and only then observed the Article autosave.
|
|
353
|
+
|
|
354
|
+
An August 19 capture proved that the Article banner is not a body image. The
|
|
355
|
+
editor registers it with `PUBLISHING_COVER_IMAGE`, transfers the bytes once,
|
|
356
|
+
and autosaves the returned asset through
|
|
357
|
+
`coverMediaV2Union.coverImage` with the exact reviewed CoverImage type and an
|
|
358
|
+
empty caption. Independent editor-response readback exposes matching legacy
|
|
359
|
+
and V2 cover projections bound to the same stable asset URN. The current draft
|
|
360
|
+
contract therefore requires one outer `cover_image` on create and plans a
|
|
361
|
+
supplied replacement cover as `articles.cover` before body images. When an
|
|
362
|
+
exact replacement omits it, Ghostget preserves and verifies the current banner
|
|
363
|
+
asset without registering or transferring another cover. In either case, the
|
|
364
|
+
banner stays out of the document and `inline_images`.
|
|
365
|
+
|
|
366
|
+
An August 19 recovery exercise also proved why this distinction matters: a
|
|
367
|
+
cover dispatch can become indeterminate after LinkedIn has retained the banner
|
|
368
|
+
but before Ghostget verifies that dispatch. Never retry that cover upload. After
|
|
369
|
+
separate inspection establishes that an exact replacement draft already has
|
|
370
|
+
the intended banner, a new confirmed replacement may omit `cover_image` and
|
|
371
|
+
preserve that independently read asset while repairing only its body. That is
|
|
372
|
+
a distinct intent, not reconciliation or retry of the uncertain upload.
|
|
373
|
+
|
|
374
|
+
The active image contract has no automated reconciliation path because an
|
|
375
|
+
uncertain upload may have created a provider asset absent from the confirmed
|
|
376
|
+
input. Preserve partial or indeterminate runs and do not retry or repeat
|
|
377
|
+
uploads. Exact read-only replacement reconciliation remains only for
|
|
378
|
+
already-durable historical text-only contract evidence.
|
|
379
|
+
|
|
380
|
+
The presence of a LinkedIn editor or saved UI state alone is not a contract.
|
|
381
|
+
Do not type into the editor as a runtime fallback. `articles.publish` remains a
|
|
382
|
+
separate capture-required R3 operation with its own publication evidence.
|
|
383
|
+
|
|
384
|
+
## Resolve current LinkedIn material
|
|
385
|
+
|
|
386
|
+
Derive the `csrf-token` header from exactly one bounded `JSESSIONID` cookie. Strip only the reviewed wrapper quotes and require the expected `ajax:` token form. Never log or return the cookie or derived token.
|
|
387
|
+
|
|
388
|
+
Resolve a registered query such as `voyagerFeedDashMainFeed` or `messengerMessages` from bounded current candidates by exact operation prefix. Require exactly one `<prefix>.<32-hex>` match. Zero matches mean drift; several matches mean ambiguity. Both fail before the API request.
|
|
389
|
+
|
|
390
|
+
Keep query IDs, CSRF material, cookies, variables, feature sets, and private identifiers out of manifests and receipts.
|
|
391
|
+
|
|
392
|
+
## Preserve capture-required operations
|
|
393
|
+
|
|
394
|
+
The current registry keeps these unavailable until their exact first-party exchanges are captured and reviewed:
|
|
395
|
+
|
|
396
|
+
- `feeds.read` `feed=home`, `relationships.recommendations.read`, `messaging.list`, `messaging.read`, `posts.read`, `comments.read`, and `articles.read` (`R1`);
|
|
397
|
+
- `messaging.send` (`R3`);
|
|
398
|
+
- `posts.repost` and `posts.quote` (`R3`);
|
|
399
|
+
- `comments.create` and `replies.create` (`R3`);
|
|
400
|
+
- `relationships.connect` (`R3`);
|
|
401
|
+
- `reactions.set` (`R2`);
|
|
402
|
+
- `articles.publish` (`R3`);
|
|
403
|
+
|
|
404
|
+
Do not guess a Voyager/GraphQL mutation from a bundle, replay a captured payload, or use the composer as a fallback. To graduate one operation:
|
|
405
|
+
|
|
406
|
+
1. capture one exact low-stakes fixture;
|
|
407
|
+
2. bind the current member/organization actor;
|
|
408
|
+
3. bind conversation/profile/organization/post/root/parent target IDs;
|
|
409
|
+
4. bind returned message/comment/post/article identity and successful state;
|
|
410
|
+
5. exclude unrelated background mutations;
|
|
411
|
+
6. test revision drift, account mismatch, response drift, and uncertainty;
|
|
412
|
+
7. bump the contract and adapter versions.
|
|
413
|
+
|
|
414
|
+
For `messaging.send`, use an already-read, user-approved, low-stakes conversation. Keep recruiting and employment threads out of fixtures. A successful pressure test requires the internal `createMessage` response contract and an independent R1 read of the exact returned message; a visibly cleared textbox is irrelevant. Text-only and each attachment family are separate fixtures: the current manifest accepts one reviewed image, GIF, MP4 video, PDF, presentation, or word-processing document, but that input schema remains inert until upload initialization, byte transfer, asset ownership, message association, and independent readback are all captured and response-bound.
|
|
415
|
+
|
|
416
|
+
`posts.publish@3` is the separate observed R3 post contract. It accepts exact
|
|
417
|
+
text and at most one plan-bound PNG with descriptive alt text, admits the
|
|
418
|
+
image transfer and post create once, stages the PNG as at most 569 ordered
|
|
419
|
+
48-KiB base64 chunks in batches of at most 32 commands, clears that page state
|
|
420
|
+
before transfer, durably retains the response-bound share URN, and verifies it
|
|
421
|
+
through an independent current-member readback. It does not authorize an
|
|
422
|
+
Article publication, repost, quote, comment, message, or additional media.
|
|
423
|
+
|
|
424
|
+
For `relationships.connect`, use a user-approved profile that is not already
|
|
425
|
+
connected or invitation-pending. Prove the preflight relationship state, exact
|
|
426
|
+
target profile URN, optional note, returned invitation identity/state, and
|
|
427
|
+
independent relationship readback. A disabled Connect button is not evidence.
|
|
428
|
+
|
|
429
|
+
## Risk and confirmation
|
|
430
|
+
|
|
431
|
+
R1 reads run only after they graduate and pass account binding.
|
|
432
|
+
`reactions.set` is R2 only as an exact desired-state create/delete pair. A
|
|
433
|
+
private `articles.draft.save` is R2 because its exact autosave and unpublished
|
|
434
|
+
readback contract has graduated. Messages, comments, replies, posts, reposts,
|
|
435
|
+
quotes, connection requests, and article publication are R3; only the exact
|
|
436
|
+
observed `posts.publish@3` post shape is executable among those R3 families.
|
|
437
|
+
|
|
438
|
+
Every R2/R3 operation must preview the exact account realm, actor, target, text/media hashes, side effect, contract hash, and dispatch schedule. Confirm once. Require local duplicate refusal. Treat an uncertain response after request start as `indeterminate`; never retry by clicking LinkedIn or by changing message whitespace.
|
|
439
|
+
|
|
440
|
+
## Recapture on drift
|
|
441
|
+
|
|
442
|
+
Fail before the semantic request when the registered query, path, allowed query fields, Rest.li shape, feature contract, CSRF source, response status/content type, projection, or target/account binding changes. Restore the affected operation to `capture-required`, record a new managed HAR, update owned code, and rerun deterministic plus authorized live tests. Never update the client directly from arbitrary live traffic.
|