@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,101 @@
|
|
|
1
|
+
# WhatsApp local Message Like Me export
|
|
2
|
+
|
|
3
|
+
Use this reference to turn one existing account-bound Wacli projection into a
|
|
4
|
+
private Message Like Me bundle. The export reads local state. It does not pair
|
|
5
|
+
a device, synchronize WhatsApp, open a network connection, or send a message.
|
|
6
|
+
|
|
7
|
+
## Runtime identity
|
|
8
|
+
|
|
9
|
+
Ghostget pins the official macOS arm64 Wacli v0.15.0 release at commit
|
|
10
|
+
`a020de724180d31eccfa5241d45443402d62fb06`.
|
|
11
|
+
|
|
12
|
+
- Official archive: `wacli_0.15.0_darwin_arm64.tar.gz`
|
|
13
|
+
- Archive SHA-256:
|
|
14
|
+
`2b54f33d246e913a5c33525b4fc895a345363c2dcc673c70fa5f19cffb15d17d`
|
|
15
|
+
- Executable SHA-256:
|
|
16
|
+
`a900af4d0dfd10471bcdf74105b9f256d1a08574242a041df3e5985a548826aa`
|
|
17
|
+
- Code-signature identity: `org.openclaw.wacli`, OpenClaw Foundation Team ID
|
|
18
|
+
`FWJYW4S8P8`
|
|
19
|
+
|
|
20
|
+
Run `ghostget operator doctor --json` to locate the release-matched installer.
|
|
21
|
+
The installer checks the official release, both SHA-256 values, the offline
|
|
22
|
+
code signature, hardened runtime, trusted timestamp, designated requirement,
|
|
23
|
+
and online notarization before it publishes the executable. Runtime reads
|
|
24
|
+
repeat the official release, exact executable SHA-256, and offline
|
|
25
|
+
code-signature checks. They do not claim to repeat online notarization.
|
|
26
|
+
|
|
27
|
+
## Export one private bundle
|
|
28
|
+
|
|
29
|
+
Use a bound WhatsApp auth ID whose existing local store contains `session.db`
|
|
30
|
+
and `wacli.db`. Choose a new normalized absolute output directory below an
|
|
31
|
+
owner-controlled parent:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
ghostget whatsapp export-message-like-me --auth whatsapp-main \
|
|
35
|
+
--output /absolute/private/path/new-whatsapp-bundle --json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The auth ID is lowercase kebab case with at most 48 characters. The output
|
|
39
|
+
path is a non-root absolute path of at most 4,096 UTF-8 bytes with no NUL,
|
|
40
|
+
carriage return, or line feed. The destination must not exist.
|
|
41
|
+
|
|
42
|
+
Ghostget holds one durable private-export admission across recovery, helper
|
|
43
|
+
launch, conversion, cleanup, and publication. It validates the bound store's
|
|
44
|
+
owner, mode, physical identity, schema, integrity, sidecars, account identity,
|
|
45
|
+
and immutable generation. One detached helper keeps the databases open across
|
|
46
|
+
bounded row-ID pages and seals its final counts, checkpoint, self aliases, and
|
|
47
|
+
rolling canonical-frame SHA-256. Ghostget publishes a result only after the
|
|
48
|
+
complete helper stream and exact child exit settle.
|
|
49
|
+
|
|
50
|
+
## Bundle identity
|
|
51
|
+
|
|
52
|
+
The output is Message Like Me local-message bundle schema 2:
|
|
53
|
+
|
|
54
|
+
- source `wacli-local@1.0.0`;
|
|
55
|
+
- provider `whatsapp@0.15.0`;
|
|
56
|
+
- network `whatsapp`;
|
|
57
|
+
- immutable consumer `@hraness/message-like-me` v0.7.0;
|
|
58
|
+
- six NDJSON artifacts plus `manifest.json`.
|
|
59
|
+
|
|
60
|
+
Ghostget imports Message Like Me's public schema-2 constants, parser, and types.
|
|
61
|
+
The standalone release gate runs the real Message Like Me v0.7.0 CLI against a
|
|
62
|
+
Ghostget-generated seven-file bundle.
|
|
63
|
+
|
|
64
|
+
The output directory is mode `0700`; its files are mode `0600`. Ghostget writes
|
|
65
|
+
and verifies a complete sibling staging directory, then publishes it with one
|
|
66
|
+
atomic rename. A partial directory never appears at the requested path.
|
|
67
|
+
|
|
68
|
+
## Included and excluded evidence
|
|
69
|
+
|
|
70
|
+
The bundle can retain locally stored message bodies, bubble boundaries,
|
|
71
|
+
reply IDs, attachment metadata, and only edit or deletion state proven by the
|
|
72
|
+
fixed projection. It excludes credentials, protocol and media keys, media
|
|
73
|
+
bytes, source paths, local media paths, status chats, broadcasts, newsletters,
|
|
74
|
+
and unsupported non-conversation rows.
|
|
75
|
+
|
|
76
|
+
The helper derives at most the bound account's exact phone-number (PN) and
|
|
77
|
+
linked-identity (LID) self aliases from the unique device row. It filters a
|
|
78
|
+
message-yourself chat for either alias before message content crosses the
|
|
79
|
+
helper boundary. It does not guess identity from digits.
|
|
80
|
+
|
|
81
|
+
Reaction rows are excluded. Wacli v0.15.0 cannot prove whether a stored
|
|
82
|
+
reaction is still active or was removed, so every applicable bundle reports
|
|
83
|
+
`reaction-state-unproven` instead of publishing retained reaction state.
|
|
84
|
+
|
|
85
|
+
## Completeness
|
|
86
|
+
|
|
87
|
+
The receipt reports:
|
|
88
|
+
|
|
89
|
+
- completeness kind `bounded-local`;
|
|
90
|
+
- reason `local-store-coverage-unknown`;
|
|
91
|
+
- warning `remote-history-incomplete`;
|
|
92
|
+
- exactly one account, zero reactions, and zero tombstones.
|
|
93
|
+
|
|
94
|
+
`observedFrom` and `observedThrough` describe the admitted local messages only.
|
|
95
|
+
A successful export does not prove that remote WhatsApp history has finished
|
|
96
|
+
backfilling. Additional warnings report excluded self chats, purged message
|
|
97
|
+
payloads, or excluded non-conversation chats when those conditions occur.
|
|
98
|
+
|
|
99
|
+
Keep the bundle private. It contains message bodies and stable account,
|
|
100
|
+
conversation, participant, and message evidence even though credentials,
|
|
101
|
+
paths, and media bytes are excluded.
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# X authenticated web API adapter
|
|
2
|
+
|
|
3
|
+
The `x-web` schema-v4 adapter executes fixed, code-owned first-party `x.com` GraphQL/internal API exchanges with a signed-in cookie realm. A browser may record a managed HAR, bootstrap private session material, or resolve a reviewed current operation revision or transaction value. It never reads a feed, publishes, likes, bookmarks, or messages through X's DOM.
|
|
4
|
+
|
|
5
|
+
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 or unsolicited automation outside ghostget.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- [Install and inspect](#install-and-inspect)
|
|
10
|
+
- [Save an Article draft](#save-an-article-draft)
|
|
11
|
+
- [Read one private Article draft](#read-one-private-article-draft)
|
|
12
|
+
- [Configure and bind the signed-in realm](#configure-and-bind-the-signed-in-realm)
|
|
13
|
+
- [Use observed contracts](#use-observed-contracts)
|
|
14
|
+
- [Export bookmarks](#export-bookmarks)
|
|
15
|
+
- [Resolve current X material](#resolve-current-x-material)
|
|
16
|
+
- [Preserve capture-required mutations](#preserve-capture-required-mutations)
|
|
17
|
+
- [Other capture-required operations](#other-capture-required-operations)
|
|
18
|
+
- [Risk and confirmation](#risk-and-confirmation)
|
|
19
|
+
- [Recapture on drift](#recapture-on-drift)
|
|
20
|
+
|
|
21
|
+
## Install and inspect
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
ghostget adapter validate src/assets/adapters/x/wrench-web-adapter.json
|
|
25
|
+
ghostget adapter install src/assets/adapters/x/wrench-web-adapter.json
|
|
26
|
+
ghostget capabilities x-web --json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`observed` means the exact code-owned contract version may execute. `capture-required` performs no request and never opens a browser-action fallback.
|
|
30
|
+
|
|
31
|
+
The separate `x` adapter uses X's documented OAuth API. It covers documented reverse-chronological/user/mentions/List/recent-search/bookmark reads and approved posting, reply, thread, repost, bookmark, Article, media, and legacy-DM surfaces; it never supplies For You. Encrypted X Chat remains a separate cryptographic contract. Keep these transports and auth realms distinct, and never switch among them after preview or because one lacks coverage.
|
|
32
|
+
|
|
33
|
+
## Save an Article draft
|
|
34
|
+
|
|
35
|
+
Use `x-web articles.draft.save` to create or replace one private native X
|
|
36
|
+
Article. This is an observed R2 contract with no publish-capable branch. It
|
|
37
|
+
accepts a reviewed title, a canonical provider-neutral `ArticleDraftDocument`,
|
|
38
|
+
and an optional exact existing private `draft_id`. Read [native article
|
|
39
|
+
drafts](article-drafts.md) before constructing the document.
|
|
40
|
+
|
|
41
|
+
The current contract uses `ArticleDraftDocument` schemaVersion 2. It supports
|
|
42
|
+
paragraphs, headings, lists, blockquotes, native HTTPS links, bold, italic, or
|
|
43
|
+
strikethrough ranges, and 1–20 ordered plan-bound JPEG, PNG, or WebP inline
|
|
44
|
+
images up to 5 MiB each. Image captions are supported. Native alt-text writing,
|
|
45
|
+
covers, proprietary embed cards, HTML, Markdown, and editor payloads remain
|
|
46
|
+
outside this contract. The caller owns every editorial and image-placement
|
|
47
|
+
choice.
|
|
48
|
+
|
|
49
|
+
For a source X status embedded in an Article, use
|
|
50
|
+
`projectXStatusArticleEmbed`. The default X projection is the exact status text
|
|
51
|
+
in a blockquote followed immediately by its canonical native X link. Omit
|
|
52
|
+
profile chrome, timestamps, engagement metrics, and card screenshots unless
|
|
53
|
+
the user explicitly requests them as Article content. This representation is
|
|
54
|
+
stable rich text plus a native link; it does not claim to create a proprietary
|
|
55
|
+
X embed card.
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
ghostget adapter sync-bundled --json
|
|
59
|
+
ghostget auth add x-main --cookie-source arc
|
|
60
|
+
ghostget auth bind x-main --site x
|
|
61
|
+
ghostget capabilities x-web --json
|
|
62
|
+
|
|
63
|
+
ghostget x-web articles.draft.save \
|
|
64
|
+
--input @/absolute/private/article-draft-input.json \
|
|
65
|
+
--auth x-main --preview --json
|
|
66
|
+
|
|
67
|
+
ghostget confirm <preview-digest> --json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Review the bound numeric account, exact title, canonical document, ordered
|
|
71
|
+
attachment hashes, optional draft ID, contract version 2, and the image-upload
|
|
72
|
+
plus create or title/content replacement schedule. A successful result must identify `articles.draft.save`, report
|
|
73
|
+
`published: false` and `mode: "draft"`, and return the private draft ID and edit
|
|
74
|
+
URL. The runtime independently reads the result and binds its unpublished
|
|
75
|
+
state, owner, title, content, captions, image order, and uploaded media IDs.
|
|
76
|
+
|
|
77
|
+
The active image contract has no automatic reconciliation path because an
|
|
78
|
+
uncertain upload may have created a provider media ID that is absent from the
|
|
79
|
+
confirmed input. Preserve every partial or indeterminate run and do not retry,
|
|
80
|
+
search by title, guess an ID, or repeat uploads. Exact read-only replacement
|
|
81
|
+
reconciliation remains only for already-durable historical text-only runs.
|
|
82
|
+
|
|
83
|
+
`articles.publish` is a distinct capture-required R3 operation. Its mutation
|
|
84
|
+
and public readback are outside the observed private-draft contract. Never use
|
|
85
|
+
a saved draft ID, a draft preview, or the presence of an
|
|
86
|
+
`ArticleEntityPublish` descriptor as publication authority. Keep the separate
|
|
87
|
+
official `x` OAuth transport and its previews isolated from this signed-in
|
|
88
|
+
cookie realm.
|
|
89
|
+
|
|
90
|
+
The documented OAuth `x` adapter also exposes draft saving and publication as
|
|
91
|
+
two semantic operations. `x articles.draft.save` is an observed R2 private
|
|
92
|
+
draft create using its reviewed plain-text body and optional-cover schema;
|
|
93
|
+
it binds the returned draft ID and title but does not make a separate
|
|
94
|
+
unpublished read. `x articles.publish` is the separate R3 publish-only
|
|
95
|
+
operation and binds the publish response rather than claiming an independent
|
|
96
|
+
public readback. The retired
|
|
97
|
+
`draft_only` input is accepted by neither current contract. The retained
|
|
98
|
+
`articles.publish@2` route is available only for exact recovery of already
|
|
99
|
+
durable v2 evidence; it is not selected for a new preview. Inspect both current
|
|
100
|
+
capabilities and keep their OAuth plans separate from the `x-web` cookie realm.
|
|
101
|
+
|
|
102
|
+
## Read one private Article draft
|
|
103
|
+
|
|
104
|
+
Use `x-web articles.read@2` to read one exact current-viewer-owned private X
|
|
105
|
+
Article in the `Draft` lifecycle. Pass its 1–19 digit private ID through the
|
|
106
|
+
same bound X cookie realm used for other authenticated web operations:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
ghostget x-web articles.read \
|
|
110
|
+
--input '{"article_id":"1234567890123456789"}' \
|
|
111
|
+
--auth x-main --json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This is an R1 read with no mutation dispatch. Ghostget resolves the current
|
|
115
|
+
viewer before the Article query, requires the result to echo the requested ID
|
|
116
|
+
and viewer-owner ID, and accepts only `lifecycle: "Draft"` with
|
|
117
|
+
`published: false`. The closed output includes the exact ID, owner ID, private
|
|
118
|
+
draft kind, lifecycle, one bounded single-line title, and bounded normalized
|
|
119
|
+
rich content.
|
|
120
|
+
|
|
121
|
+
The contract does not list drafts, read another account's draft, or read a
|
|
122
|
+
published Article. Those surfaces remain capture-required. Do not use an edit
|
|
123
|
+
URL, title search, or the separate official OAuth adapter as a fallback.
|
|
124
|
+
|
|
125
|
+
## Configure and bind the signed-in realm
|
|
126
|
+
|
|
127
|
+
Prefer a target-filtered browser cookie source:
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
ghostget auth add x-main --cookie-source arc --cookie-profile "Profile 2"
|
|
131
|
+
ghostget auth bind x-main --site x
|
|
132
|
+
ghostget auth list --json
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Use a private profile snapshot only when current local/session storage or first-party assets are needed to recover an approved authorization value or registered-operation revision.
|
|
136
|
+
|
|
137
|
+
Before private reads or mutations, resolve the current stable X user ID through a reviewed account request and compare it with the realm's expected binding. Bind created posts, replies, quotes, reposts, likes, bookmarks, and DMs to that account plus the exact requested target. Fail before dispatch on account ambiguity or mismatch.
|
|
138
|
+
|
|
139
|
+
## Use observed contracts
|
|
140
|
+
|
|
141
|
+
The current registry marks these code-owned reads observed:
|
|
142
|
+
|
|
143
|
+
- `feeds.read`: one bounded For You, Following, user, List, search, or bookmarks page; bookmarks pages also emit stable `items` keyed by `post_id`;
|
|
144
|
+
- `posts.read`: one exact post through the current TweetDetail query;
|
|
145
|
+
- `comments.read`: one bounded TweetDetail conversation/reply page;
|
|
146
|
+
- `articles.read@2`: one exact current-viewer-owned private Article Draft.
|
|
147
|
+
|
|
148
|
+
Authorized direct live evidence for this contract version covers For You,
|
|
149
|
+
bookmarks, one exact post and its bounded comments, plus one exact private
|
|
150
|
+
Article Draft. Following, user, List, and search remain declared modes of the
|
|
151
|
+
observed `feeds.read` contract; check `ghostget capabilities x-web --json` for the
|
|
152
|
+
installed input schema and let current preflight fail closed on revision drift.
|
|
153
|
+
|
|
154
|
+
The observed web writes are `likes.set`, `content.save`, and
|
|
155
|
+
`articles.draft.save`, all R2. Like and bookmark evidence comes from prior
|
|
156
|
+
reversible live fixtures, not the current read-only probes. Preview the exact
|
|
157
|
+
post ID and desired `liked` or `saved` boolean, confirm the returned digest, and
|
|
158
|
+
inspect the receipt. ghostget does not mark either desired-state mutation
|
|
159
|
+
verified until an independent TweetResultByRestId readback matches that
|
|
160
|
+
boolean. Article draft saving uses the separate exact unpublished Article
|
|
161
|
+
readback described above.
|
|
162
|
+
|
|
163
|
+
Examples:
|
|
164
|
+
|
|
165
|
+
```sh
|
|
166
|
+
ghostget x-web feeds.read \
|
|
167
|
+
--input '{"feed":"for-you","limit":25}' \
|
|
168
|
+
--auth x-main --json
|
|
169
|
+
|
|
170
|
+
ghostget x-web feeds.read \
|
|
171
|
+
--input '{"feed":"bookmarks","limit":25}' \
|
|
172
|
+
--auth x-main --json
|
|
173
|
+
|
|
174
|
+
ghostget x-web posts.read \
|
|
175
|
+
--input '{"post_id":"POST_ID"}' \
|
|
176
|
+
--auth x-main --json
|
|
177
|
+
|
|
178
|
+
ghostget x-web comments.read \
|
|
179
|
+
--input '{"post_id":"ROOT_POST_ID","limit":50}' \
|
|
180
|
+
--auth x-main --json
|
|
181
|
+
|
|
182
|
+
ghostget x-web articles.read \
|
|
183
|
+
--input '{"article_id":"1234567890123456789"}' \
|
|
184
|
+
--auth x-main --json
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
One page is not a completeness claim. Return a provider cursor only after projecting the complete provider page. If X returns more matching posts or replies than the requested projection limit, fail without exposing the end cursor instead of silently skipping unseen entries. User and List feeds additionally require the response to echo exactly the requested user/List identity. Keep inbox listing separate from conversation read so the R1 contract can exclude acknowledgement traffic.
|
|
188
|
+
|
|
189
|
+
DM folder/conversation reads remain `capture-required` because current X Chat
|
|
190
|
+
events are encrypted. They require the separate reviewed key-recovery,
|
|
191
|
+
plaintext projection, and acknowledgement-free contract. Published Article
|
|
192
|
+
reads, draft listing, and any entitlement-specific Article variant beyond the
|
|
193
|
+
exact private Draft contract remain `capture-required`.
|
|
194
|
+
|
|
195
|
+
## Export bookmarks
|
|
196
|
+
|
|
197
|
+
`x-web feeds.read` with `feed:"bookmarks"` reads one bounded page of the
|
|
198
|
+
signed-in account's bookmarks through the captured Bookmarks GraphQL query. It
|
|
199
|
+
does not scrape the x.com DOM. Use this page when a daily digest needs a stable
|
|
200
|
+
JSON list it can upsert by post ID.
|
|
201
|
+
|
|
202
|
+
```sh
|
|
203
|
+
ghostget auth add x-main --cookie-source arc
|
|
204
|
+
ghostget auth bind x-main --site x
|
|
205
|
+
ghostget capabilities x-web --json
|
|
206
|
+
|
|
207
|
+
ghostget x-web feeds.read \
|
|
208
|
+
--input '{"feed":"bookmarks","limit":25}' \
|
|
209
|
+
--auth x-main --json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
A succeeded JSON result has `output.feed` equal to `"bookmarks"`. Upsert
|
|
213
|
+
`output.items`. Each item has this exact shape:
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"post_id": "2078889282404569267",
|
|
218
|
+
"url": "https://x.com/i/status/2078889282404569267",
|
|
219
|
+
"author_username": "hraness",
|
|
220
|
+
"author_name": "Hraness",
|
|
221
|
+
"text": "Exact status text",
|
|
222
|
+
"created_at": "Tue Jul 22 12:00:00 +0000 2026",
|
|
223
|
+
"folder_id": null,
|
|
224
|
+
"bookmarked_at": null
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
`post_id` is the stable X status ID. Treat a repeated `post_id` as the same
|
|
229
|
+
bookmark. `url` is the `/i/status/{post_id}` permalink, so it stays valid if
|
|
230
|
+
the author handle changes. `author_username` and `author_name` are null when
|
|
231
|
+
the GraphQL page omits the author nest. `folder_id` and `bookmarked_at` are
|
|
232
|
+
present and null on the current Bookmarks page; do not invent folder or
|
|
233
|
+
timestamp values.
|
|
234
|
+
|
|
235
|
+
Pass the previous page's `output.cursor` as `cursor` to read the next page:
|
|
236
|
+
|
|
237
|
+
```sh
|
|
238
|
+
ghostget x-web feeds.read \
|
|
239
|
+
--input '{"feed":"bookmarks","limit":25,"cursor":"PREVIOUS_PAGE_CURSOR"}' \
|
|
240
|
+
--auth x-main --json
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Stop when `output.cursor` is null, when `terminatedDirections` includes
|
|
244
|
+
`Bottom`, or when every returned `post_id` is already in the store. If the
|
|
245
|
+
provider page contains more matching posts than `limit`, the command fails
|
|
246
|
+
closed or returns `cursor: null` instead of skipping unseen entries. Bind the
|
|
247
|
+
signed-in account before the read; an account mismatch fails before the
|
|
248
|
+
Bookmarks query. This is an R1 read and does not change unlabeled-copy or Made
|
|
249
|
+
with AI publish behavior.
|
|
250
|
+
|
|
251
|
+
The same invocation still returns `output.posts` with the shared camelCase feed
|
|
252
|
+
projection (`id` equals `post_id`). Prefer `output.items` for an external
|
|
253
|
+
sqlite upsert.
|
|
254
|
+
|
|
255
|
+
## Resolve current X material
|
|
256
|
+
|
|
257
|
+
Code owns the operation name, exact GraphQL path, feature variables, query/body shape, and response projection. Current registered-operation revisions may be recovered from bounded first-party assets or capture metadata only by exact operation prefix. Require one unique match.
|
|
258
|
+
|
|
259
|
+
Acquire cookies through the auth layer. Route the reviewed CSRF value only to the fixed CSRF header and a captured/storage authorization value only to `authorization`. Keep both in memory. Never put a bearer value, CSRF token, cookie, feature contract, query revision, or raw GraphQL variables in a manifest, preview, receipt, URL log, or generic output.
|
|
260
|
+
|
|
261
|
+
Return `capture-required` on a missing or ambiguous operation revision, feature drift, token-source drift, response-shape drift, or account-binding failure. Do not launch the X composer to compensate.
|
|
262
|
+
|
|
263
|
+
## Preserve capture-required mutations
|
|
264
|
+
|
|
265
|
+
The current registry keeps these text/desired-state exchanges capture-required:
|
|
266
|
+
|
|
267
|
+
- `threads.publish` (`R3`): one confirmed ordered root/self-reply schedule;
|
|
268
|
+
- `replies.create` (`R3`): one text reply bound to an exact parent;
|
|
269
|
+
- `posts.repost` (`R3`): exact desired repost state;
|
|
270
|
+
- `posts.quote` (`R3`): one text quote bound to an exact post.
|
|
271
|
+
- `content.delete` (`R3`): the DeleteTweet descriptor is revision evidence only; keep deletion capture-required until an authorized fixture binds the exact authored target and text, request variables, accepted response, and exact not-found readback.
|
|
272
|
+
|
|
273
|
+
Current `x-client-transaction-id` generation is code-owned: ghostget resolves the unique wrapper module, exported helper, and lazy-module evidence from the current first-party main bundle, calls that cached helper through one contained private agent-browser session, closes and cleans the session, then places the ephemeral value only on the already-reviewed in-origin mutation request. Drift or bootstrap failure occurs before the durable dispatch boundary and is never retried. This prerequisite does not by itself graduate the contract states listed above.
|
|
274
|
+
|
|
275
|
+
`likes.set` and `content.save` (`R2`) bind the exact account and post, select only the matching create/delete mutation for the confirmed desired state, validate the operation-specific `Done` response, and independently read the same post through TweetResultByRestId before marking the dispatch verified. Separate reversible live fixtures proved bookmark false → true → false and like false → true → false, including both independent reads and restoration of the original false state. `articles.draft.save` is the separate observed private structured-text-and-inline-image contract above.
|
|
276
|
+
|
|
277
|
+
`posts.publish@5` is the separate observed R3 post contract. It accepts exact
|
|
278
|
+
text up to the reviewed CreateTweet 25000-unit bound without truncation, and at
|
|
279
|
+
most one plan-bound PNG or MP4, binds the account and uploaded media ID, admits
|
|
280
|
+
one CreateTweet dispatch, binds long-form text from `note_tweet` when present,
|
|
281
|
+
durably retains the response-bound post/media target before readback, and polls
|
|
282
|
+
only that exact post through TweetResultByRestId. A live account that cannot
|
|
283
|
+
accept that length fails closed. Prefer one long `posts.publish` over a
|
|
284
|
+
`threads.publish` split. Threads, replies, reposts, quotes, DMs, and Article
|
|
285
|
+
publishing remain capture-required. Per-item `threads.publish` maxLength stays
|
|
286
|
+
280 because reply composition and thread-split still use the short-item bound.
|
|
287
|
+
|
|
288
|
+
CreateTweet sends empty `semantic_annotation_ids` and no AI or
|
|
289
|
+
content-disclosure field. The reviewed GraphQL contract has no
|
|
290
|
+
`made_with_ai` or `content_disclosure` input; do not invent one. Official
|
|
291
|
+
OAuth `x` `posts.publish` exposes optional `made_with_ai` and sends `true`
|
|
292
|
+
only when the caller explicitly asks. Leave that field unset or `false` for
|
|
293
|
+
user-supplied cross-post copy. JPEG and PNG uploads are re-encoded to
|
|
294
|
+
pixels-only bytes before INIT or APPEND. A live Made with AI sparkle on
|
|
295
|
+
CreateTweet or TweetResultByRestId is a failed unlabeled-copy publish.
|
|
296
|
+
See [X AI disclosure](x-ai-disclosure.md).
|
|
297
|
+
|
|
298
|
+
Bind every CreateTweet response to the authenticated account and requested reply/quote parent. For a thread, bind each returned post ID, use it as the next reviewed parent, and durably mark each dispatch. Stop on `partial` or `indeterminate`; never replay the root or remaining continuations automatically.
|
|
299
|
+
|
|
300
|
+
Treat repost, like, and bookmark as desired state only when both create and delete mutations are reviewed and response-bound. A state mismatch is not permission to issue another mutation blindly.
|
|
301
|
+
|
|
302
|
+
Article covers, embeds, video, and native image alt text are outside
|
|
303
|
+
`articles.draft.save`. Inline images use only the exact plan-bound file array;
|
|
304
|
+
do not ignore a supplied file or fall back to DOM upload.
|
|
305
|
+
|
|
306
|
+
## Other capture-required operations
|
|
307
|
+
|
|
308
|
+
The current `x-web` registry keeps these unavailable:
|
|
309
|
+
|
|
310
|
+
- `messaging.list` and `messaging.read` (`R1`) until verified X Chat key recovery, plaintext projection, and acknowledgement-free handling are installed;
|
|
311
|
+
- `messaging.send` (`R3`) until its exact current mutation, conversation/user target, response, and media path are captured;
|
|
312
|
+
- `articles.publish` (`R3`) until the distinct publish mutation and public
|
|
313
|
+
readback are captured and response-bound. `articles.draft.save` never
|
|
314
|
+
authorizes `ArticleEntityPublish`.
|
|
315
|
+
|
|
316
|
+
No operation may be guessed from downloaded bundles or copied network snippets. A capture-required DM send must not type into X's message composer.
|
|
317
|
+
|
|
318
|
+
Encrypted X Chat is not a normal HAR template. Plaintext and send require a separately reviewed cryptographic contract for key recovery, request signatures, Juicebox access, exact payload encryption and decryption, and forward compatibility.
|
|
319
|
+
|
|
320
|
+
## Risk and confirmation
|
|
321
|
+
|
|
322
|
+
R1 reads run only after account binding and exclusion of seen/read
|
|
323
|
+
acknowledgement requests. The private Article read additionally binds the exact
|
|
324
|
+
requested Draft to the current viewer. Likes, bookmarks, and private Article
|
|
325
|
+
draft saves are R2. Posts, replies, quotes, reposts, threads, DMs, and Article
|
|
326
|
+
publication are R3.
|
|
327
|
+
|
|
328
|
+
Preview the exact account realm, target, body/items, attachment hashes, reply settings, desired state, contract hash, and dispatch schedule. Confirm once. Require duplicate refusal. If a request left but its response or target binding is uncertain, report `indeterminate` and preserve the ledger.
|
|
329
|
+
|
|
330
|
+
## Recapture on drift
|
|
331
|
+
|
|
332
|
+
Recapture when the operation revision, feature variables, path, request fields, authorization/CSRF source, response status/content type, projection, or identity binding changes. Update owned code, bump the contract and adapter versions, and rerun deterministic plus authorized live tests. Never patch a live request from arbitrary HAR values and never substitute browser clicks.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Keep user-supplied X cross-posts unlabeled
|
|
2
|
+
|
|
3
|
+
Ghostget's cross-post workflow must not label user-supplied X copy as Made with
|
|
4
|
+
AI or Made with Grok. A live sparkle label means the publish failed, even if X
|
|
5
|
+
accepted the post.
|
|
6
|
+
|
|
7
|
+
The rule applies only to the user-supplied cross-post package. The official
|
|
8
|
+
provider input still accepts an explicitly authorized `made_with_ai: true` for
|
|
9
|
+
attached media outside this workflow.
|
|
10
|
+
|
|
11
|
+
## Prefer a Ghostget transport
|
|
12
|
+
|
|
13
|
+
Use an installed Ghostget `posts.publish` transport. Do not open the X composer
|
|
14
|
+
to compensate for a missing, `capture-required`, or failed contract.
|
|
15
|
+
|
|
16
|
+
- Official `x` `posts.publish` exposes optional `made_with_ai`. Leave it unset
|
|
17
|
+
or `false` for user-supplied cross-post copy. Set `true` only as a separate,
|
|
18
|
+
explicit request to label attached media as AI-generated.
|
|
19
|
+
- `x-web` `posts.publish` has no AI-disclosure input. Do not invent one. The
|
|
20
|
+
reviewed CreateTweet contract sends empty `semantic_annotation_ids` and no
|
|
21
|
+
content-disclosure field. Ghostget rejects `made_with_ai`,
|
|
22
|
+
`content_disclosure`, and nonempty `semantic_annotation_ids` on this route.
|
|
23
|
+
- Inspect every other installed schema for a comparable flag and leave it unset
|
|
24
|
+
or `false` for the user-supplied package.
|
|
25
|
+
|
|
26
|
+
Do not add "Made with AI", "Made with Grok", or similar disclosure text to the
|
|
27
|
+
body.
|
|
28
|
+
|
|
29
|
+
Keep R3 preview and confirm unchanged. Review the digest, then run the printed
|
|
30
|
+
`ghostget confirm <digest>`.
|
|
31
|
+
|
|
32
|
+
## Scrub attachment provenance
|
|
33
|
+
|
|
34
|
+
Turning Content disclosure off is not enough. X can still auto-apply Made with
|
|
35
|
+
AI from C2PA or other provenance in the uploaded bytes (`caBX` PNG chunks,
|
|
36
|
+
`trainedAlgorithmicMedia`, `digitalSourceType`, OpenAI Content Credentials).
|
|
37
|
+
|
|
38
|
+
Ghostget re-encodes each attached JPEG or PNG to pixels-only bytes before INIT
|
|
39
|
+
or APPEND. If the bytes that would be uploaded still match those provenance
|
|
40
|
+
markers, the run fails before dispatch.
|
|
41
|
+
|
|
42
|
+
Classifier labels can still appear on images that have no obvious C2PA. Treat
|
|
43
|
+
live readback as the source of truth.
|
|
44
|
+
|
|
45
|
+
## Composer fallback
|
|
46
|
+
|
|
47
|
+
Use the X composer only when the user explicitly asked for that fallback after
|
|
48
|
+
a Ghostget transport was unavailable. Before Post:
|
|
49
|
+
|
|
50
|
+
1. Open the post `…` menu.
|
|
51
|
+
2. Open Content disclosure.
|
|
52
|
+
3. Confirm Made with AI is OFF. If the switch will not turn off, or is locked
|
|
53
|
+
or greyed, stop. That is an auto-label. Do not post.
|
|
54
|
+
4. Close the dialog and confirm the composer no longer shows a Made with AI
|
|
55
|
+
disclosure before clicking Post.
|
|
56
|
+
|
|
57
|
+
After publish:
|
|
58
|
+
|
|
59
|
+
1. Open the live permalink. Do not infer success from a cleared composer.
|
|
60
|
+
2. If the sparkle Made with AI or Made with Grok label is present, the publish
|
|
61
|
+
failed. Report the permalink and the label. Do not report success.
|
|
62
|
+
3. A locked or greyed Content disclosure toggle after Post is the same
|
|
63
|
+
auto-label failure.
|
|
64
|
+
4. Do not delete or repost unless the user asks.
|
|
65
|
+
|
|
66
|
+
## Fail-closed live readback
|
|
67
|
+
|
|
68
|
+
A labeled post is a failed publish. Ghostget classifies that outcome as a
|
|
69
|
+
terminal unlabeled-copy failure and does not report success. The post may
|
|
70
|
+
already exist on X. Leave it in place unless the user asks for cleanup through
|
|
71
|
+
an installed `content.delete` capability.
|