@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,496 @@
|
|
|
1
|
+
# Provider plugins
|
|
2
|
+
|
|
3
|
+
Use a provider plugin when a reviewed official API, first-party web API,
|
|
4
|
+
linked-device protocol, or exact provider CLI needs provider-specific contracts
|
|
5
|
+
and execution. Ghostget has two distributions over one logical registry:
|
|
6
|
+
|
|
7
|
+
- a source plugin is reviewed repository code statically assembled into Ghostget;
|
|
8
|
+
- a portable plugin is a self-contained immutable package that Ghostget verifies,
|
|
9
|
+
explicitly trusts, and runs through a bounded child-process protocol.
|
|
10
|
+
|
|
11
|
+
Neither kind is an installed adapter manifest. Source-plugin adapters remain
|
|
12
|
+
parsed local selectors. An enabled portable plugin owns virtual manifests that
|
|
13
|
+
the kernel projects from its verified package.
|
|
14
|
+
|
|
15
|
+
## Inspect the registry
|
|
16
|
+
|
|
17
|
+
Ghostget uses the `ghostget` command:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
ghostget plugin list
|
|
21
|
+
ghostget plugin list --json
|
|
22
|
+
ghostget plugin show <plugin-id>
|
|
23
|
+
ghostget plugin show <plugin-id> --json
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The plural `plugins` command is an alias over the same registry:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
ghostget plugins list --json
|
|
30
|
+
ghostget plugins show <plugin-id> --json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Use `plugin list` to discover source code available in the current Ghostget build and
|
|
34
|
+
portable packages enabled in the current `GHOSTGET_STATE_HOME`. Use `plugin show` to
|
|
35
|
+
inspect one plugin's version, source kind, immutable identity or implementation
|
|
36
|
+
files, transport bindings, exact surfaces and origins, auth kinds, capability
|
|
37
|
+
ceiling, subject format, and versioned semantic operations.
|
|
38
|
+
|
|
39
|
+
`ghostget capabilities` answers a different question. It reports executable or
|
|
40
|
+
`capture-required` adapter operations for the current `GHOSTGET_STATE_HOME`: stored data
|
|
41
|
+
manifests resolved through source plugins plus virtual manifests owned by
|
|
42
|
+
enabled portable plugins. A source plugin can exist without a corresponding
|
|
43
|
+
stored manifest.
|
|
44
|
+
|
|
45
|
+
Commands that interpret provider ownership or protected origins use the same
|
|
46
|
+
active registry: capability and doctor reports, adapter validation and
|
|
47
|
+
installation, derivation, auth binding, invocation, confirmation, and
|
|
48
|
+
reconciliation cannot disagree about an enabled portable plugin.
|
|
49
|
+
|
|
50
|
+
## Treat source plugins as trusted code
|
|
51
|
+
|
|
52
|
+
Source plugins run in Ghostget's Bun process. They have the operating-system
|
|
53
|
+
authority of that process. TypeScript types, registry validation, and a
|
|
54
|
+
`capture-required` contract constrain how the kernel calls a plugin; they do
|
|
55
|
+
not isolate the plugin from the filesystem, network, environment, or process.
|
|
56
|
+
Review plugin code and every owned implementation file as trusted executable
|
|
57
|
+
code.
|
|
58
|
+
|
|
59
|
+
When `plugin.ts` defines a source plugin, Ghostget snapshots every eagerly imported
|
|
60
|
+
repository module and every exact installed package tree that could have
|
|
61
|
+
contributed a planner, validator, subject matcher, or other function object to
|
|
62
|
+
the descriptor. Registry startup must rediscover the same closure and bytes.
|
|
63
|
+
This prevents an old evaluated function from being published under a hash of
|
|
64
|
+
new source.
|
|
65
|
+
|
|
66
|
+
The registry separately snapshots each plugin's complete lazy runtime
|
|
67
|
+
implementation and dependency identity. Immediately before and after the first
|
|
68
|
+
runtime import, Ghostget rereads only that owning closure and rejects drift; restart
|
|
69
|
+
Ghostget after changing source files. These checks protect normal
|
|
70
|
+
upgrade/replacement workflows and prevent a changed runtime from reaching an
|
|
71
|
+
operation. They are not an atomic sandbox against a same-account writer racing
|
|
72
|
+
the module loader: changed top-level module code could run before the
|
|
73
|
+
post-import check rejects.
|
|
74
|
+
|
|
75
|
+
Treat built-in durable contract identity as the final semantic review step,
|
|
76
|
+
never an iteration mechanism. Finish provider code, manifests, deterministic
|
|
77
|
+
tests, documentation, and formatting before changing a semantic-identity
|
|
78
|
+
digest. Then run the focused contract test once to obtain the exact new digest,
|
|
79
|
+
review and record it, and run registry startup once more. Ghostget derives the
|
|
80
|
+
current source/dependency closure automatically, snapshots it at registry
|
|
81
|
+
startup, and revalidates it before and after lazy runtime load. It deliberately
|
|
82
|
+
has no manual closure allowlist or source-hash approval step.
|
|
83
|
+
|
|
84
|
+
Bare package imports are bound to their exact relocation-stable dependency
|
|
85
|
+
graph, not the repository's whole lockfile. Ghostget snapshots each installed package
|
|
86
|
+
with bounded full-tree walks around its byte reads, hashes the exact paths and
|
|
87
|
+
bytes, records required, optional, peer, and statically imported resolution
|
|
88
|
+
edges, and revalidates shared startup snapshots before the registry becomes
|
|
89
|
+
usable. Unrelated lockfile edits therefore do not invalidate a plugin, while an
|
|
90
|
+
entrypoint, undeclared hoisted import, optional dependency, duplicate physical
|
|
91
|
+
package occurrence, or package byte change does. Source-plugin package code
|
|
92
|
+
must use literal `import()` and `require()` targets so that executable closure
|
|
93
|
+
is knowable; an explicitly reviewed built-in exception is code-owned and
|
|
94
|
+
identity-bound. Agent-authored code that needs dynamic loading belongs in one
|
|
95
|
+
self-contained portable package instead of weakening this boundary.
|
|
96
|
+
|
|
97
|
+
Source identity also binds the Bun version, `NODE_ENV`, repository package
|
|
98
|
+
module semantics, safe `bunfig.toml`, the complete `tsconfig` extends chain,
|
|
99
|
+
and the nearest package scope for JavaScript. Ghostget must start from the checked
|
|
100
|
+
repository root and refuses ambient loader, preload, condition, transform,
|
|
101
|
+
working-directory, and tsconfig overrides. Repository modules may use
|
|
102
|
+
JavaScript or TypeScript module extensions plus imported JSON or TOML data.
|
|
103
|
+
JSX, TSX, custom loaders, URL imports, and computed module targets are rejected
|
|
104
|
+
because their executable closure depends on configuration or cannot be known
|
|
105
|
+
statically.
|
|
106
|
+
|
|
107
|
+
`plugin check` reads a bounded fixed file set, parses its data, and syntax-checks
|
|
108
|
+
TypeScript without importing the plugin. It proves scaffold shape and
|
|
109
|
+
fail-closed reservation state. It does not make later plugin execution safe or
|
|
110
|
+
establish that the implementation is trustworthy.
|
|
111
|
+
|
|
112
|
+
`adapter install` installs a parsed data manifest only. Do not present it as a
|
|
113
|
+
code-plugin installer. Ghostget never imports portable JavaScript into its process,
|
|
114
|
+
executes an authoring directory, runs package lifecycle scripts, or resolves
|
|
115
|
+
dependencies from ancestor `node_modules`.
|
|
116
|
+
|
|
117
|
+
## Author and trust a portable plugin
|
|
118
|
+
|
|
119
|
+
Create the smallest inert package that reserves one semantic operation:
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
ghostget plugin init example-web \
|
|
123
|
+
--display-name "Example" \
|
|
124
|
+
--surface example \
|
|
125
|
+
--origin https://www.example.com \
|
|
126
|
+
--operation feeds.read \
|
|
127
|
+
--output /absolute/private/example-web
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The generated package contains:
|
|
131
|
+
|
|
132
|
+
- `ghostget-plugin.json`, the strict identity, runtime, file inventory, capability
|
|
133
|
+
ceiling, bindings, subject contract, and semantic operations;
|
|
134
|
+
- `dist/plugin.mjs`, one self-contained Bun child-process runtime;
|
|
135
|
+
- `fixtures/*.json`, bounded secret-free deterministic invocations;
|
|
136
|
+
- `AGENTS.md`, package-local authoring and protocol guidance.
|
|
137
|
+
|
|
138
|
+
It starts `capture-required` and network-inert. An agent may implement it
|
|
139
|
+
without editing Ghostget, but must still prove the same origin, current-account,
|
|
140
|
+
request, response, target, side-effect, uncertainty, and drift facts required
|
|
141
|
+
for a source plugin. Then verify the fixed package boundary:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
ghostget plugin check /absolute/private/example-web --json
|
|
145
|
+
ghostget plugin test /absolute/private/example-web --trust-code --json
|
|
146
|
+
ghostget plugin pack /absolute/private/example-web \
|
|
147
|
+
--output /absolute/private/example-web.wrenchplugin --json
|
|
148
|
+
ghostget plugin install /absolute/private/example-web.wrenchplugin \
|
|
149
|
+
--trust-code --json
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`check` parses only a bounded canonical file tree without executing package
|
|
153
|
+
code and rejects symbolic links,
|
|
154
|
+
special files, native code, package-manager state, shells, dynamic module
|
|
155
|
+
loading, undeclared files, duplicate current contracts, and authority outside
|
|
156
|
+
the declared ceiling. `test --trust-code` binds the explicit execution
|
|
157
|
+
decision to the exact verified plugin ID, semantic version, and bundle digest
|
|
158
|
+
before running declared secret-free fixtures; its child process is not a
|
|
159
|
+
hostile-code sandbox. `pack` publishes verified bytes into a new empty package
|
|
160
|
+
directory. `install
|
|
161
|
+
--trust-code` records an explicit decision for the exact plugin ID, semantic
|
|
162
|
+
version, manifest hash, and bundle hash before enabling it.
|
|
163
|
+
|
|
164
|
+
Verification is an object-capability boundary, not a structural TypeScript
|
|
165
|
+
claim. The catalog accepts only the exact deeply frozen package value returned
|
|
166
|
+
by the verifier; a copied object with plausible digests is not verified.
|
|
167
|
+
Generic source-registry construction rejects portable projections. The
|
|
168
|
+
portable catalog alone asks the kernel runtime builder for child-host wrappers,
|
|
169
|
+
freezes each binding, operation descriptor, and runtime-hook container before
|
|
170
|
+
recording its package authority, projects virtual manifests, and then extends
|
|
171
|
+
an already validated source-only registry. No API can authorize
|
|
172
|
+
caller-supplied in-process hooks as portable package code.
|
|
173
|
+
|
|
174
|
+
The host starts the verified artifact with a minimal environment and exact
|
|
175
|
+
protocol, input, output, deadline, and frame bounds. Portable code receives
|
|
176
|
+
opaque handles rather than raw auth locators or arbitrary paths. Its optional
|
|
177
|
+
authorities are:
|
|
178
|
+
|
|
179
|
+
- exact-origin, DNS/IP-pinned HTTPS with no credential-bearing redirects;
|
|
180
|
+
- declared cookie or OAuth material usable only through its matching request
|
|
181
|
+
sink;
|
|
182
|
+
- exact size- and SHA-bound plan-file reads;
|
|
183
|
+
- bundle-, adapter-, auth-, and key-namespaced state;
|
|
184
|
+
- bounded redacted logging;
|
|
185
|
+
- one kernel-bracketed dispatch begin/request/verify sequence for mutations.
|
|
186
|
+
|
|
187
|
+
Resource owners register teardown before they start. After an operation
|
|
188
|
+
terminalizes, Ghostget gives the complete cleanup join one separate 30-second bound.
|
|
189
|
+
A still-pending or rejected barrier becomes cleanup-unsafe, rejects the
|
|
190
|
+
kernel-visible barrier, and preserves a durable retry fence rather than
|
|
191
|
+
silently authorizing another run. Portable plugins retain an invocation lease
|
|
192
|
+
that blocks the same plugin even if its bundle is replaced. Built-in and source
|
|
193
|
+
authenticated-web plugins retain an auth-realm admission keyed by the exact
|
|
194
|
+
surface and auth locator; registration durably marks the realm resource-active
|
|
195
|
+
before the resource starts. Same-boot cleanup-unsafe state is fail-closed and
|
|
196
|
+
visible in `ghostget operator doctor`. The browser publishes an exact prepared
|
|
197
|
+
root generation before profile effects, then durably records launch intent and
|
|
198
|
+
an immutable live control pin. Same-boot recovery first leases the exact claim,
|
|
199
|
+
then binds the private session to its daemon start identity, socket, engine,
|
|
200
|
+
launch hash, and CDP endpoint before graceful close or a bounded TERM. It
|
|
201
|
+
records quiescence only after the pinned owner is dead, the session is inactive,
|
|
202
|
+
and CDP refuses three times. Root deletion is then journaled one exact target at
|
|
203
|
+
a time; an already-absent root is accepted only from that durable quiescent
|
|
204
|
+
phase, while any replacement fails closed. Every remaining root must still
|
|
205
|
+
match its device, inode, birth time, owner, and private mode. Live or changed
|
|
206
|
+
owners, missing publication, unknown liveness, changed roots, and generic
|
|
207
|
+
cleanup failures remain fenced. Legacy claims may be adopted only while their
|
|
208
|
+
exact private session is live and bindable; dead legacy claims remain retained. Run
|
|
209
|
+
`ghostget operator doctor` until it reports either repaired state or a bounded
|
|
210
|
+
retention category before retrying. Never edit or delete a durable claim to
|
|
211
|
+
bypass this recovery boundary.
|
|
212
|
+
|
|
213
|
+
All other capabilities are denied. Process isolation contains ordinary crashes
|
|
214
|
+
and dependency mistakes; it is not a hostile-code sandbox for deliberately
|
|
215
|
+
malicious code running under the same OS account.
|
|
216
|
+
|
|
217
|
+
Portable v1 may describe a `linked-device` binding only as a network-inert
|
|
218
|
+
`capture-required` reservation. Observed linked-device operations, pairing,
|
|
219
|
+
and sync remain source-plugin-only until a portable lifecycle protocol can
|
|
220
|
+
preserve the same admission, journal, acknowledgement, and recovery
|
|
221
|
+
invariants. Ghostget rejects that execution path without transport fallback.
|
|
222
|
+
Portable v1 also rejects `local-cli`: verified native executable discovery,
|
|
223
|
+
process authority, and subprocess cleanup remain source-plugin-only.
|
|
224
|
+
|
|
225
|
+
Every installed `messaging.list` and `messaging.read` operation also declares
|
|
226
|
+
its omni state. Use `unsupported` with a concrete bounded reason unless exact
|
|
227
|
+
provider output semantics justify a source-owned materializer. A supported
|
|
228
|
+
materializer is pure, versioned, included in the plugin's reviewed
|
|
229
|
+
implementation closure, and returns only the strict shared page envelope. It
|
|
230
|
+
must reject unknown or changed provider fields at a bounded provider-owned
|
|
231
|
+
structural boundary without echoing unreviewed foreign names or values through
|
|
232
|
+
public status. It must state identity, page membership, completeness,
|
|
233
|
+
continuation, and tombstone semantics without inventing cross-provider
|
|
234
|
+
equivalence. The kernel reparses its return value from `unknown`. Omni v1 has
|
|
235
|
+
no provider-authored write-invalidation
|
|
236
|
+
tags. Auth-incarnation, materializer, and plugin implementation identity changes
|
|
237
|
+
strand prior normalized coordinates. Exact-query freshness advances only
|
|
238
|
+
through explicit revalidation, while materializer drift keeps the last good
|
|
239
|
+
derivative with an explicit categorical status. Its detailed provider-local
|
|
240
|
+
diagnostic remains encrypted. Portable v1 messaging remains explicitly
|
|
241
|
+
unsupported until the package protocol can attest the same output and
|
|
242
|
+
materializer closure.
|
|
243
|
+
|
|
244
|
+
Source linked-device pair, sync, auth replacement, auth removal, and explicit
|
|
245
|
+
reconciliation serialize on a realm derived from the provider plus canonical
|
|
246
|
+
physical store path, not the mutable auth ID. Consequently two auth aliases or
|
|
247
|
+
symlink spellings cannot bypass one another. After a post-boundary crash,
|
|
248
|
+
`ghostget runs reconcile <journal-id> --input <json>` accepts only an explicit
|
|
249
|
+
`applied` or `not-applied` observation with a SHA-256 evidence digest; it never
|
|
250
|
+
calls the lifecycle provider or retries the original effect.
|
|
251
|
+
|
|
252
|
+
An unsettled portable R2/R3 operation uses the same explicit observation
|
|
253
|
+
shape:
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{"outcome":"applied","evidenceHash":"<sha256>"}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Before cleanup, Ghostget binds that observation to the immutable receipt, bundle,
|
|
260
|
+
manifest, descriptor, auth, input, plan, and encrypted recovery capsule and
|
|
261
|
+
publishes a create-once resolution record. Repeating the exact observation is
|
|
262
|
+
idempotent; a different outcome or evidence digest is rejected. `applied`
|
|
263
|
+
retains the at-most-once ledger. Only `not-applied` releases the ledger for a
|
|
264
|
+
new, separately previewed and confirmed attempt, and only when the journal has
|
|
265
|
+
no verified dispatch. A verified dispatch permanently retains the fence even
|
|
266
|
+
if later plugin work became indeterminate. This reconciliation path does not
|
|
267
|
+
start portable code, call a provider, mutate the receipt, or retry a dispatch.
|
|
268
|
+
|
|
269
|
+
Every operation resolves to an exact immutable identity: plugin ID and
|
|
270
|
+
version, host API version, bundle and manifest SHA-256, adapter, transport,
|
|
271
|
+
surface, operation, contract version, and descriptor SHA-256. Ghostget retains that
|
|
272
|
+
identity in plans, receipts, run journals, and encrypted recovery capsules.
|
|
273
|
+
Live R1 work also owns an exact process-bound invocation lease.
|
|
274
|
+
|
|
275
|
+
Updates are compare-and-swap operations:
|
|
276
|
+
|
|
277
|
+
```sh
|
|
278
|
+
ghostget plugin install /absolute/private/example-web-v2.wrenchplugin \
|
|
279
|
+
--trust-code --expected-current <old-bundle-sha256>
|
|
280
|
+
ghostget plugin disable example-web --expected-current <bundle-sha256>
|
|
281
|
+
ghostget plugin remove example-web --expected-current <bundle-sha256> --yes
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The catalog lock serializes portable activation, adapter installation,
|
|
285
|
+
invocation leases, and confirmation-plan publication. Ghostget refuses update,
|
|
286
|
+
disable, or removal while the exact old bundle owns a live/unknown invocation,
|
|
287
|
+
preview, claim, nonterminal or unreconciled run, recovery capsule, or
|
|
288
|
+
linked-device lifecycle. Invalid or unexpected durable state also blocks.
|
|
289
|
+
`remove` deletes activation only; immutable artifact and trust evidence remain
|
|
290
|
+
available for audit and historical recovery.
|
|
291
|
+
|
|
292
|
+
Each command observes one validated catalog snapshot. Adapter synchronization
|
|
293
|
+
records the installed-plugin fingerprint used to derive its candidate
|
|
294
|
+
generation and rechecks that fingerprint while holding the publication lock;
|
|
295
|
+
a concurrent plugin activation cannot publish adapters for a mixed catalog.
|
|
296
|
+
|
|
297
|
+
## Preserve the kernel boundary
|
|
298
|
+
|
|
299
|
+
The kernel owns authority policy and durable state:
|
|
300
|
+
|
|
301
|
+
- auth selection, locator loading, and credential-scope validation;
|
|
302
|
+
- attachment resolution and content-bound asset bundles;
|
|
303
|
+
- risk enforcement, exact preview, digest confirmation, and R4 refusal;
|
|
304
|
+
- dispatch scheduling, journaling, at-most-once state, recovery, and receipts;
|
|
305
|
+
- output bounds, terminal sanitization, and redaction.
|
|
306
|
+
|
|
307
|
+
A plugin owns provider-specific meaning:
|
|
308
|
+
|
|
309
|
+
- plugin identity, exact transport, surface, runtime endpoint, manifest-origin,
|
|
310
|
+
and protected-hostname-family ownership;
|
|
311
|
+
- semantic operation contracts, input refinements, and subject format;
|
|
312
|
+
- current-account probing and account, actor, and target checks;
|
|
313
|
+
- deterministic dispatch planning, execution, and optional reconciliation;
|
|
314
|
+
- the complete implementation-source list used for its code identity.
|
|
315
|
+
|
|
316
|
+
The trusted source-plugin v1 contexts retain compatibility with existing
|
|
317
|
+
runtimes: an official-provider executor can receive its selected auth locator,
|
|
318
|
+
loaded token material, bounded HTTP client, and resolver-produced local file
|
|
319
|
+
paths; web and linked-device runtimes receive their corresponding scoped
|
|
320
|
+
context; a local CLI runtime receives the same bounded dispatch lifecycle but
|
|
321
|
+
owns exact executable and subprocess validation. This does not attenuate the
|
|
322
|
+
process's authority or isolate secrets from plugin code. Keep additions
|
|
323
|
+
transport-specific and narrowly typed; do not add arbitrary requests, argv, or
|
|
324
|
+
unrelated kernel objects. The portable
|
|
325
|
+
out-of-process host replaces these values with opaque, bounded host
|
|
326
|
+
capabilities. Never fall back between official API, web-session API,
|
|
327
|
+
linked-device protocol, local CLI, and browser behavior.
|
|
328
|
+
|
|
329
|
+
## Define one binding
|
|
330
|
+
|
|
331
|
+
Every plugin definition is validated and deeply frozen. Its top level declares
|
|
332
|
+
`apiVersion: 1`, a strict kebab-case `id`, semantic `version`, `displayName`,
|
|
333
|
+
`sourceKind`, owned implementation sources, and at least one binding.
|
|
334
|
+
|
|
335
|
+
Each binding declares:
|
|
336
|
+
|
|
337
|
+
- one `provider-api`, `web-session-api`, `linked-device`, or `local-cli`
|
|
338
|
+
transport;
|
|
339
|
+
- a strict kebab-case `surfaceId`;
|
|
340
|
+
- the exact code-owned runtime `origin`;
|
|
341
|
+
- exact `manifestOrigins` when the public product origin differs from the
|
|
342
|
+
runtime endpoint;
|
|
343
|
+
- `protectedHostnameFamilies` that reserve the provider's signed-in hostname
|
|
344
|
+
family from generic browser and reviewed-template adapters;
|
|
345
|
+
- accepted auth kinds and one stable, namespaced subject matcher;
|
|
346
|
+
- one or more versioned semantic operations;
|
|
347
|
+
- a lazy runtime loader. Import provider execution code only inside that
|
|
348
|
+
loader.
|
|
349
|
+
|
|
350
|
+
A `local-cli` binding additionally declares one strict tool identity. It names
|
|
351
|
+
the upstream version under an explicit `semver` or `opaque` scheme and pins the
|
|
352
|
+
final executable SHA-256 for every supported platform and architecture. Bind
|
|
353
|
+
published source, release-commit, release-manifest, archive, and download
|
|
354
|
+
provenance too; an archive or manifest URL and digest are an all-or-nothing
|
|
355
|
+
pair. The operation's semantic contract and the tool's byte identity are
|
|
356
|
+
separate version boundaries, but both enter durable implementation identity.
|
|
357
|
+
When the executable speaks a separately versioned provider API, include the
|
|
358
|
+
reviewed API schema or SDK revision in the operation implementation identity;
|
|
359
|
+
an executable digest cannot prove that an independently updated server kept
|
|
360
|
+
the same semantics.
|
|
361
|
+
|
|
362
|
+
An operation declares its active `contractVersion`, any structurally compatible
|
|
363
|
+
`historicalContractVersions`, exact risk, bounded input schema, side effect,
|
|
364
|
+
idempotency and dedupe policy, observed or capture-required state, dispatch
|
|
365
|
+
shape, deterministic planner, and input validator. Optional hooks may bind an
|
|
366
|
+
input actor to the auth subject or declare boolean desired-state
|
|
367
|
+
reconciliation. A linked-device binding can additionally declare inspect,
|
|
368
|
+
pair, and one-shot sync lifecycle support.
|
|
369
|
+
|
|
370
|
+
`manifestOrigins` and `protectedHostnameFamilies` are different. The first is
|
|
371
|
+
the exact public origin set durable manifests must carry for current execution.
|
|
372
|
+
The second is a hostname-suffix reservation that also protects sibling API and
|
|
373
|
+
asset hosts. For example, a runtime at `api.example.com` and public product at
|
|
374
|
+
`www.example.com` normally reserve `example.com`. Avoid an overbroad public
|
|
375
|
+
suffix such as `co.uk`.
|
|
376
|
+
|
|
377
|
+
## Wrap one exact provider CLI
|
|
378
|
+
|
|
379
|
+
Use `local-cli` only when an official native client is the reviewed transport.
|
|
380
|
+
Keep its interface semantic: one operation owns one fixed command template,
|
|
381
|
+
strict inputs, strict projected output, exact account and target probes,
|
|
382
|
+
deadlines, byte limits, and failure categories. Maintain a deterministic
|
|
383
|
+
coverage ledger that maps every reviewed upstream canonical command to one
|
|
384
|
+
semantic operation or one explicit unavailable reason. Never expose a generic
|
|
385
|
+
command name, argument array, environment override, endpoint, or output path.
|
|
386
|
+
|
|
387
|
+
Resolve and hash the final executable before private work. Start it directly
|
|
388
|
+
without a shell under a minimal environment and operation-private config,
|
|
389
|
+
data, cache, and temporary roots. Strip ambient credentials, targets, account
|
|
390
|
+
defaults, proxies, debug flags, and plugin search state. If the CLI supports
|
|
391
|
+
user, linked, or just-in-time plugins, isolate or reject them so unbound code
|
|
392
|
+
cannot override a reviewed command.
|
|
393
|
+
|
|
394
|
+
Use exact provider IDs instead of titles, fuzzy lookup, interactive selection,
|
|
395
|
+
or ambient defaults. Stage an attachment only from the kernel's digest-bound
|
|
396
|
+
plan asset. Parse stdout and stderr from `unknown`, reject extra fields and
|
|
397
|
+
changed envelopes, and never persist argv or foreign output. Direct spawning
|
|
398
|
+
prevents shell interpretation but cannot hide private arguments from a
|
|
399
|
+
same-account process inspector, so keep such child lifetimes short and
|
|
400
|
+
document that local exposure.
|
|
401
|
+
|
|
402
|
+
For R2/R3, enter the durable dispatch boundary immediately before the effect.
|
|
403
|
+
Record an exact provider-accepted pending target when available. A lost,
|
|
404
|
+
malformed, timed-out, or signaled post-dispatch response is indeterminate and
|
|
405
|
+
must never be retried. Reconcile only with a separately reviewed exact read.
|
|
406
|
+
One local-CLI dispatch item is one fixed child invocation; if that command
|
|
407
|
+
performs an internal upload followed by a provider mutation, disclose the
|
|
408
|
+
opaque sequence and possible intermediate effect. Ghostget cannot fence those
|
|
409
|
+
internal calls separately, so uncertainty begins when the child starts.
|
|
410
|
+
Raw API/RPC, software and plugin lifecycle, account recovery, arbitrary file
|
|
411
|
+
output, destructive administration, and other high-authority commands remain
|
|
412
|
+
unavailable or R4 even if the upstream CLI exposes them.
|
|
413
|
+
|
|
414
|
+
## Scaffold one source plugin
|
|
415
|
+
|
|
416
|
+
Start from one sanitized derivation candidate and one semantic operation:
|
|
417
|
+
|
|
418
|
+
```sh
|
|
419
|
+
ghostget plugin scaffold \
|
|
420
|
+
--site example \
|
|
421
|
+
--display-name "Example" \
|
|
422
|
+
--origin https://www.example.com \
|
|
423
|
+
--operation feeds.read \
|
|
424
|
+
--risk R1 \
|
|
425
|
+
--evidence /absolute/private/derivation/internal-api-evidence.json \
|
|
426
|
+
--candidate 0 \
|
|
427
|
+
--output src/plugins/example-web \
|
|
428
|
+
--json
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
`ghostget adapter scaffold` remains a compatibility alias. New agent workflows
|
|
432
|
+
should use `ghostget plugin scaffold`.
|
|
433
|
+
|
|
434
|
+
The scaffold creates one source-plugin directory containing:
|
|
435
|
+
|
|
436
|
+
- `plugin.ts`;
|
|
437
|
+
- `runtime.ts`;
|
|
438
|
+
- `plugin.test.ts`;
|
|
439
|
+
- `runtime.internal.test.ts`;
|
|
440
|
+
- `wrench-adapter.json`;
|
|
441
|
+
- `promotion-checklist.json`.
|
|
442
|
+
|
|
443
|
+
The generated plugin is network-inert and `capture-required`. Scaffolding does
|
|
444
|
+
not register it, install its manifest, promote its operation, or authorize a
|
|
445
|
+
live request.
|
|
446
|
+
|
|
447
|
+
## Implement and register the contract
|
|
448
|
+
|
|
449
|
+
1. Review the sanitized evidence and promotion checklist. Bind the exact
|
|
450
|
+
origin, method, path construction, query or body shape, fixed header sinks,
|
|
451
|
+
response variants, account, actor, target, incidental effects, and output
|
|
452
|
+
bounds in source.
|
|
453
|
+
2. Keep the operation `capture-required` while any request, response, identity,
|
|
454
|
+
target, or drift fact is unknown. A type-correct runtime is not evidence.
|
|
455
|
+
3. Add deterministic contract and runtime tests for the exact observed
|
|
456
|
+
exchange, malformed input, redirects, response drift, wrong identity,
|
|
457
|
+
output bounds, and secret redaction. Add dispatch and reconciliation cases
|
|
458
|
+
for R2/R3.
|
|
459
|
+
4. Check the complete source unit before registration:
|
|
460
|
+
|
|
461
|
+
```sh
|
|
462
|
+
ghostget plugin check src/plugins/example-web --json
|
|
463
|
+
bun test src/plugins/example-web
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
5. Keep the reviewed directory at `src/plugins/<plugin-id>` and run
|
|
467
|
+
`bun run src/scripts/generate-provider-plugin-catalog.ts`. The generator scans only that source root and
|
|
468
|
+
writes static imports. Do not add runtime directory scanning or load code
|
|
469
|
+
from local state.
|
|
470
|
+
List the plugin and provider entry roots in the implementation-source
|
|
471
|
+
closure. Ghostget then resolves and binds every recursive local value dependency,
|
|
472
|
+
so an agent can split JavaScript or TypeScript code into helpers without
|
|
473
|
+
manually maintaining a duplicate file list. Keep installed package loads
|
|
474
|
+
literal and declared when possible. Ghostget follows literal undeclared package
|
|
475
|
+
imports defensively, but rejects computed package loads because no
|
|
476
|
+
statically knowable implementation identity can include an unknown target.
|
|
477
|
+
Definitions are bounded before Ghostget copies their sources, bindings,
|
|
478
|
+
operations, contract histories, origins, auth kinds, scopes, coverage, or
|
|
479
|
+
input fields.
|
|
480
|
+
Source plugins are trusted repository code, not a hostile-code sandbox;
|
|
481
|
+
use a portable plugin whenever agent-authored code needs dynamic loading or
|
|
482
|
+
process isolation.
|
|
483
|
+
6. Inspect the assembled result, then install and inspect the separate data
|
|
484
|
+
manifest:
|
|
485
|
+
|
|
486
|
+
```sh
|
|
487
|
+
ghostget plugin show example-web --json
|
|
488
|
+
ghostget adapter validate src/plugins/example-web/wrench-adapter.json --json
|
|
489
|
+
ghostget adapter install src/plugins/example-web/wrench-adapter.json
|
|
490
|
+
ghostget capabilities example-web --json
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
Promote an operation to `observed` only after deterministic tests and one
|
|
494
|
+
authorized low-stakes fixture prove the exact contract. A plugin update changes
|
|
495
|
+
its implementation identity and invalidates stale previews; it does not
|
|
496
|
+
reinterpret an unsettled historical receipt.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Reddit flair
|
|
2
|
+
|
|
3
|
+
Inspect `ghostget capabilities reddit-web --json` before using flair.
|
|
4
|
+
`flair.user.choices` reads the bound account's self-selectable user flair.
|
|
5
|
+
`flair.post.choices` reads the post flair available for a new submission. Both
|
|
6
|
+
are observed R1 contracts:
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
ghostget reddit-web flair.user.choices \
|
|
10
|
+
--auth <reddit-auth> \
|
|
11
|
+
--input '{"community":"Python"}' \
|
|
12
|
+
--json
|
|
13
|
+
|
|
14
|
+
ghostget reddit-web flair.post.choices \
|
|
15
|
+
--auth <reddit-auth> \
|
|
16
|
+
--input '{"community":"Python"}' \
|
|
17
|
+
--json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The output contains exact template IDs, visible text, text editability,
|
|
21
|
+
position, and current-selection state. Duplicate IDs, malformed markup,
|
|
22
|
+
account drift, redirects, oversized responses, and unreviewed provider shapes
|
|
23
|
+
fail closed. Empty text is valid for an icon-only flair.
|
|
24
|
+
|
|
25
|
+
`flair.user.select` and `flair.post.select` remain **capture-required**. Their
|
|
26
|
+
schemas are reserved, but they perform no mutation. Do not report that Ghostget
|
|
27
|
+
can apply flair until the relevant selection contract is observed and an
|
|
28
|
+
independent same-account readback passes.
|
|
29
|
+
|
|
30
|
+
## Choose flair under the caller's authority
|
|
31
|
+
|
|
32
|
+
When the user authorizes appropriate flair selection, choose it without asking
|
|
33
|
+
them to pick a label. Read the community's current rules, including expanded
|
|
34
|
+
authorship restrictions, and its live self-selectable choices. Post flair
|
|
35
|
+
classifies one contribution. User flair represents the account within one
|
|
36
|
+
community and can be required even for comments.
|
|
37
|
+
|
|
38
|
+
Match post flair to the content and use a required promotion category honestly.
|
|
39
|
+
Preserve an appropriate existing user flair. Otherwise choose a neutral label
|
|
40
|
+
or a role supported by the user's stated facts. Do not invent an occupation,
|
|
41
|
+
credential, diagnosis, housing status, or moderator role. Skip a destination
|
|
42
|
+
with no truthful choice. Flair does not make a prohibited contribution eligible.
|
|
43
|
+
|
|
44
|
+
The caller owns this decision. Ghostget supplies account-bound options and a
|
|
45
|
+
separate exact mutation boundary; it does not infer personal facts or run a
|
|
46
|
+
growth loop.
|
|
47
|
+
|
|
48
|
+
## Complete a selection contract before enabling it
|
|
49
|
+
|
|
50
|
+
Use [managed derivation](derivation.md) for one explicitly authorized account,
|
|
51
|
+
community, and low-stakes selection. Verify the displayed account against the
|
|
52
|
+
outreach account before recording or changing anything. An existing browser
|
|
53
|
+
auth locator may belong to a different account; never silently substitute it.
|
|
54
|
+
|
|
55
|
+
Capture user and post selection separately. For a post, prove that it belongs
|
|
56
|
+
to the same account and community. The
|
|
57
|
+
[Reddit API reference](https://www.reddit.com/dev/api/) and
|
|
58
|
+
[PRAW's submission flair documentation](https://praw.readthedocs.io/en/stable/code_overview/other/submissionflair.html)
|
|
59
|
+
describe choices and selection; they do not prove an authenticated-web exchange.
|
|
60
|
+
|
|
61
|
+
The select contracts accept an exact template ID and its expected label, not
|
|
62
|
+
an arbitrary username, custom text, or moderator assignment. Before dispatch,
|
|
63
|
+
freshly read choices and reject a missing, changed, or non-self-selectable
|
|
64
|
+
template. Preserve an already selected matching flair without a mutation.
|
|
65
|
+
User selection is R2; changing flair on an existing public post is R3.
|
|
66
|
+
|
|
67
|
+
Keep the exact five-minute Ghostget preview and durable dispatch boundary.
|
|
68
|
+
Standing user authority lets the calling agent review and confirm its eligible
|
|
69
|
+
plan without requesting redundant approval. Confirm once and verify exact
|
|
70
|
+
account, community, post when relevant, template ID, and visible label through
|
|
71
|
+
independent readback. Treat uncertain writes as indeterminate, never retry them
|
|
72
|
+
blindly. A setup-only flair change is not a new public contribution.
|
|
73
|
+
|
|
74
|
+
Before promoting either selection contract, test account drift, wrong-post ownership,
|
|
75
|
+
template changes, moderator-only choices, duplicate labels, denied selection,
|
|
76
|
+
unexpected content type or redirect, and uncertain dispatch. Keep the other
|
|
77
|
+
contracts capture-required if their evidence is missing. No DOM recipe, raw
|
|
78
|
+
request fallback, or guessed endpoint belongs in the installed provider.
|