@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,390 @@
|
|
|
1
|
+
# Derive a first-party authenticated API contract
|
|
2
|
+
|
|
3
|
+
Use derivation to observe one signed-in first-party exchange and turn it into a reviewed code-owned contract. Treat browser interaction as temporary evidence collection. Do not ship the interaction as a DOM recipe.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- [Define the evidence target](#define-the-evidence-target)
|
|
8
|
+
- [Record a managed HAR](#record-a-managed-har)
|
|
9
|
+
- [Review one sealed capture](#review-one-sealed-capture)
|
|
10
|
+
- [Finish and remove the raw capture](#finish-and-remove-the-raw-capture)
|
|
11
|
+
- [Create a fail-closed provider scaffold](#create-a-fail-closed-provider-scaffold)
|
|
12
|
+
- [Promote evidence into a reviewed contract](#promote-evidence-into-a-reviewed-contract)
|
|
13
|
+
- [Install only a bounded semantic contract](#install-only-a-bounded-semantic-contract)
|
|
14
|
+
- [Forward-test the contract](#forward-test-the-contract)
|
|
15
|
+
|
|
16
|
+
## Define the evidence target
|
|
17
|
+
|
|
18
|
+
Before opening a browser, write down:
|
|
19
|
+
|
|
20
|
+
- one semantic operation, such as `messaging.list`, `messaging.send`, or `posts.publish`;
|
|
21
|
+
- one exact HTTPS first-party origin;
|
|
22
|
+
- one auth realm and expected provider account;
|
|
23
|
+
- one bounded, non-sensitive fixture;
|
|
24
|
+
- the intended risk and every plausible incidental effect;
|
|
25
|
+
- the request and response facts that must be proved.
|
|
26
|
+
|
|
27
|
+
Use a read-only fixture first. For a mutation, obtain explicit authorization for one exact low-stakes dispatch and decide how the response and visible provider state will identify the target and result.
|
|
28
|
+
|
|
29
|
+
## Record a managed HAR
|
|
30
|
+
|
|
31
|
+
Run `ghostget operator doctor`, select the auth locator, and start with response content disabled:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
ghostget derive start linkedin-web https://www.linkedin.com/feed/ \
|
|
35
|
+
--auth linkedin-main \
|
|
36
|
+
--content none \
|
|
37
|
+
--domains 'www.linkedin.com' \
|
|
38
|
+
--headed
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
For an authorized image- or video-bearing mutation, bind each media file before browser
|
|
42
|
+
startup with a repeated `--fixture` option and enable remote actions:
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
ghostget derive start example-web https://example.com/feed/ \
|
|
46
|
+
--auth example-main \
|
|
47
|
+
--content text \
|
|
48
|
+
--fixture /absolute/private/image.png \
|
|
49
|
+
--allow-remote-actions \
|
|
50
|
+
--headed
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Ghostget copies at most 20 PNG, JPEG, GIF, WebP, or MP4 files into the mode-private
|
|
54
|
+
derivation directory, records only their byte counts, detected media types,
|
|
55
|
+
SHA-256 hashes, and `fixture:<n>` references, and never retains their original
|
|
56
|
+
paths. Upload only a start-bound reference to a current snapshot file input:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
ghostget derive browser <id> -- upload @e5 fixture:1
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
If the accessible attach control is a button backed by a hidden input, use the
|
|
63
|
+
fixed `@single-file-input` reference. Ghostget first proves that the current page
|
|
64
|
+
contains exactly one HTML file input; it never accepts a caller-selected CSS
|
|
65
|
+
selector:
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
ghostget derive browser <id> -- upload @single-file-input fixture:1
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
When a site keeps its file input behind a closed native chooser, bind the
|
|
72
|
+
visible upload control from a fresh snapshot and let Ghostget attach only the
|
|
73
|
+
staged fixture through its code-owned chooser bridge:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
ghostget derive browser <id> -- choose-upload @e5 fixture:1
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This command accepts no selector, path, script, cookie, or caller-selected
|
|
80
|
+
request. It suppresses the native picker, attaches only the start-bound fixture,
|
|
81
|
+
then disables interception and closes the private CDP connection before
|
|
82
|
+
returning.
|
|
83
|
+
|
|
84
|
+
If the composer contains multiple file inputs but exactly one advertises an
|
|
85
|
+
image accept type, use the fixed `@single-image-input` reference. Ghostget proves
|
|
86
|
+
that the current page contains exactly one matching image input before upload:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
ghostget derive browser <id> -- upload @single-image-input fixture:1
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
If the composer contains multiple file inputs but exactly one advertises a
|
|
93
|
+
video accept type, use the fixed `@single-video-input` reference. Ghostget proves
|
|
94
|
+
that the current page contains exactly one matching
|
|
95
|
+
`input[type=file][accept*='video']` before upload:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
ghostget derive browser <id> -- upload @single-video-input fixture:1
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Raw paths, arbitrary selectors, and unstaged references are rejected. Ghostget
|
|
102
|
+
re-verifies the private copy immediately before and after upload and resolves
|
|
103
|
+
only that Ghostget-owned copy for the persistent browser daemon; finish/discard
|
|
104
|
+
removes it with the rest of the private derivation state. The ordinary
|
|
105
|
+
`upload` form also keeps its browser batch alive for one fixed five-second
|
|
106
|
+
settling interval so page code can consume the selected file before the short
|
|
107
|
+
helper invocation exits; the derivation remains open for later commands.
|
|
108
|
+
|
|
109
|
+
When the file upload itself is the final evidence target, prefer the terminal
|
|
110
|
+
form below. It uploads, allows one fixed five-second network-settling interval,
|
|
111
|
+
and stops HAR recording in one browser batch, then disables further browser
|
|
112
|
+
commands for that derivation. This preserves the raw capture even when a
|
|
113
|
+
provider leaves the pinned browser unable to accept a second IPC request after
|
|
114
|
+
file selection:
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
ghostget derive browser <id> -- upload-and-seal @single-file-input fixture:1
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Continue with `derive review` and `derive finish`; do not expect to type or
|
|
121
|
+
submit through a derivation after `upload-and-seal`.
|
|
122
|
+
|
|
123
|
+
Do not use `upload-and-seal` at the file-selection step of a provider dialog
|
|
124
|
+
that has a separate review or **Next** action. Selection proves only that page
|
|
125
|
+
code received the staged file; it may produce no registration or transfer.
|
|
126
|
+
Use nonterminal `upload`, inspect the resulting dialog, activate the one exact
|
|
127
|
+
review/Next action, allow the fixed settling interval, and then run `derive
|
|
128
|
+
review` to seal the recorder. LinkedIn's Article image dialog required this
|
|
129
|
+
sequence before its single-upload registration, signed transfer, and autosave
|
|
130
|
+
appeared. Keep snapshot references capture-local; never encode them in a
|
|
131
|
+
runtime contract.
|
|
132
|
+
|
|
133
|
+
Save the derivation ID. Use `ghostget derive list` to recover it after an interruption. ghostget serializes every lifecycle command for that ID from preflight through cleanup. A session becomes executable only after its create-only readiness marker binds the final session metadata; interrupted initialization remains visible as `ready: false`, `recoverable: true`. `socketAvailable` distinguishes a live helper from state left after a reboot.
|
|
134
|
+
|
|
135
|
+
Each new cookie-backed contained session launches with a deterministic,
|
|
136
|
+
task-private MV3 request guard and a task-private CONNECT proxy. The extension
|
|
137
|
+
blocks HTTP, HTTPS, WS, and WSS by default and admits HTTPS/WSS only for the
|
|
138
|
+
session's exact validated `--domains`; the proxy independently resolves every
|
|
139
|
+
CONNECT target, rejects private or reserved answers, and pins the public
|
|
140
|
+
address used for the connection while leaving TLS end to end. Ghostget verifies
|
|
141
|
+
the exact extension files, enabled ruleset, regex support, match outcomes,
|
|
142
|
+
proxy policy, helper identity, and private control channel before the first
|
|
143
|
+
provider navigation and again before each later browser batch. Each DNR check
|
|
144
|
+
starts the extension's exact MV3 background service worker through a private
|
|
145
|
+
CDP session, evaluates the fixed readiness function and exact loaded-policy
|
|
146
|
+
SHA-256 there, detaches exactly,
|
|
147
|
+
and proves that the complete pre-check page target ID/URL set did not change. Missing,
|
|
148
|
+
disabled, replaced, or tampered guard state fails closed. Legacy contained
|
|
149
|
+
sessions without this boundary are non-executable and may only be listed or
|
|
150
|
+
discarded. Path-backed profile sessions remain the separately disclosed,
|
|
151
|
+
unfiltered-egress boundary described below.
|
|
152
|
+
|
|
153
|
+
After that private readiness check, Ghostget binds the requested batch to a
|
|
154
|
+
second, code-derived agent-browser session that connects only through the exact
|
|
155
|
+
verified loopback CDP WebSocket GUID. The owner session retains the guarded
|
|
156
|
+
Chrome process; the pin carries every provider navigation, snapshot reference,
|
|
157
|
+
HAR command, cookie command, staged upload, and native-chooser click. Every pin
|
|
158
|
+
invocation includes that exact private CDP URL, and Ghostget rejects caller CDP or
|
|
159
|
+
session arguments. It also requires every returned command lifecycle to retain
|
|
160
|
+
one losslessly parsed Chrome `u64` launch identity, exactly one page, and no
|
|
161
|
+
browser launch, relaunch, or background restart.
|
|
162
|
+
|
|
163
|
+
Every mutating pin command is sent alone and must first return agent-browser's
|
|
164
|
+
exact pending-confirmation envelope. Ghostget then binds the unchanged daemon
|
|
165
|
+
PID, boot identity, process-start identity, browser identity, page URL, and DNR
|
|
166
|
+
worker before issuing a bare `confirm` command with no CDP or other launch
|
|
167
|
+
arguments. A fixed launch-mutator tripwire is explicitly denied by the action
|
|
168
|
+
policy, so recursive confirmation cannot recreate a dead Chrome. The exact
|
|
169
|
+
nested confirmed result is required; a lost or ambiguous confirmation response
|
|
170
|
+
is surfaced as a dedicated `mutation may have applied; do not retry` error and
|
|
171
|
+
is never retried. The one pending slot is protected by the
|
|
172
|
+
derivation lifecycle gate and private code-derived session. A hostile process
|
|
173
|
+
running as the same OS user and writing directly to agent-browser's private
|
|
174
|
+
socket remains outside this ordinary-failure containment boundary.
|
|
175
|
+
|
|
176
|
+
If Chrome dies or is replaced after readiness verification, the old WebSocket
|
|
177
|
+
GUID cannot attach to the replacement and the tripwire refuses implicit launch
|
|
178
|
+
before provider dispatch. The owner and pin daemon identities are published in
|
|
179
|
+
immutable private markers before use. Close and discard never rerun readiness,
|
|
180
|
+
create a pin, or issue a launch-capable command: they inspect only nonlaunching
|
|
181
|
+
session state, terminate the exact pin first and owner second, prove both
|
|
182
|
+
inactive, require three consecutive numeric-loopback TCP refusals for the
|
|
183
|
+
stored CDP endpoint, and only then close the network boundary. Missing,
|
|
184
|
+
replaced, or indeterminate ownership evidence preserves the private session.
|
|
185
|
+
An automatic `about:blank` launch is never accepted as continuity.
|
|
186
|
+
|
|
187
|
+
Agent-browser may navigate, snapshot, and exercise the chosen fixture while recording. Those actions exist only to generate evidence. Do not translate snapshot references, accessible labels, element order, or click sequences into the installed capability.
|
|
188
|
+
|
|
189
|
+
When a custom text editor appends through the ordinary semantic `fill` action,
|
|
190
|
+
clear only a current snapshot textbox reference before entering the exact fixture
|
|
191
|
+
text:
|
|
192
|
+
|
|
193
|
+
```sh
|
|
194
|
+
ghostget derive browser <id> -- cleartext @e5
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
`cleartext` accepts one snapshot reference and runs one fixed, bounded erase
|
|
198
|
+
batch. It accepts no selector, script, or caller-selected key count. Use it only
|
|
199
|
+
for capture setup; never translate the reference or erase sequence into a
|
|
200
|
+
provider contract.
|
|
201
|
+
|
|
202
|
+
For authenticated LinkedIn capture, use a path-backed `browser-profile` auth
|
|
203
|
+
locator stored with `--trust-profile-egress`, an exact
|
|
204
|
+
`--browser-executable`, and optionally a filtered Arc/Chrome
|
|
205
|
+
`--cookie-source`. ghostget clones that profile into the task-private derivation
|
|
206
|
+
directory before launch. Named agent-browser profiles are rejected because
|
|
207
|
+
they would be opened directly rather than cloned. Cookie-only contained
|
|
208
|
+
derivation is rejected for LinkedIn: the pinned agent-browser containment
|
|
209
|
+
bootstrap can lose LinkedIn's authenticated execution context, terminate its
|
|
210
|
+
Chrome child, and thereby lose the in-memory HAR while leaving the daemon
|
|
211
|
+
socket alive. Never treat an automatic `about:blank` relaunch as continuity.
|
|
212
|
+
Use Chrome or Chromium as the exact executable for an Arc snapshot. Arc may
|
|
213
|
+
attach its normal source user-data root to a task-private launch, so ghostget
|
|
214
|
+
rejects Arc itself as the managed derivation executable. Arc remains supported
|
|
215
|
+
as a fully closed source profile and as an explicitly selected cookie source.
|
|
216
|
+
Fully quit the source Chromium browser first; ghostget rejects an active or stale
|
|
217
|
+
`Singleton*`/`DevToolsActivePort` lock rather than copying unsettled LevelDB or
|
|
218
|
+
SQLite state. A path-backed profile also disables agent-browser domain
|
|
219
|
+
containment. Its `--domains` list is retained as review metadata, while
|
|
220
|
+
`--trust-profile-egress` acknowledges that the browser and page scripts may
|
|
221
|
+
contact other origins.
|
|
222
|
+
|
|
223
|
+
For an R1 capture, avoid inbox or conversation routes that emit presence, seen, read, delivery, badge, or acknowledgement traffic. Record the desired read request separately from incidental requests and explicitly deny the latter in the contract.
|
|
224
|
+
|
|
225
|
+
For an R2/R3 capture, restart with `--allow-remote-actions` only after authorization. Send the exact fixture once. Record enough response content to prove request fields, response bindings, and account/target identity, but prefer `--content none` whenever structural evidence is sufficient. Never use a production-sensitive conversation merely because it is convenient.
|
|
226
|
+
|
|
227
|
+
## Review one sealed capture
|
|
228
|
+
|
|
229
|
+
Private review can expose the structure needed to write a typed contract without printing or retaining request values:
|
|
230
|
+
|
|
231
|
+
```sh
|
|
232
|
+
ghostget derive review <id> --limit 50 --json
|
|
233
|
+
ghostget derive review <id> --entry 0 --json
|
|
234
|
+
printf '%s' '{"target":"known-fixture-value"}' \
|
|
235
|
+
| ghostget derive review <id> --entry 0 --fixtures - --json
|
|
236
|
+
printf '%s' '["viewerName","followerCount"]' \
|
|
237
|
+
| ghostget derive review <id> --entry 0 --field-names - --json
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Use `--field-names -` only when the sanitized structure has redacted a small,
|
|
241
|
+
already hypothesized request or response schema key. Supply a JSON array of
|
|
242
|
+
1–50 unique exact names on bounded stdin. Each name must be a non-credential
|
|
243
|
+
schema-key string of at most 128 characters. `fieldNameMatches` identifies each
|
|
244
|
+
candidate only by its zero-based array index, fixed `:candidate-field`
|
|
245
|
+
locations, sorted structural value types, and truncation state. Probe matches
|
|
246
|
+
never label or echo a candidate name and never return provider values. The
|
|
247
|
+
independently sanitized `structure` remains unchanged, so a name already in
|
|
248
|
+
Ghostget's reviewed structural vocabulary may still appear there. Matching is
|
|
249
|
+
exact and case-sensitive over
|
|
250
|
+
own keys in bounded parsed JSON request bodies, JSON-valued query fields, and
|
|
251
|
+
JSON responses. Credential subtrees and dynamic-map key positions remain
|
|
252
|
+
opaque. `--field-names -` and `--fixtures -` are mutually exclusive; repeat
|
|
253
|
+
the entry review separately when both kinds of evidence are needed.
|
|
254
|
+
|
|
255
|
+
Review stays on the derivation target origin by default. If the one operation
|
|
256
|
+
intentionally uses another HTTPS origin, that hostname must have been covered
|
|
257
|
+
by the immutable `--domains` declaration at `derive start`. Select it with one
|
|
258
|
+
canonical exact origin (no path, query, fragment, credentials, or trailing
|
|
259
|
+
slash):
|
|
260
|
+
|
|
261
|
+
```sh
|
|
262
|
+
ghostget derive start example-web https://www.example.com/feed/ \
|
|
263
|
+
--domains 'www.example.com,upload.example.net' ...
|
|
264
|
+
ghostget derive review <id> \
|
|
265
|
+
--review-origin https://upload.example.net --limit 50 --json
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
An undeclared origin is rejected before the recorder is stopped or sealed,
|
|
269
|
+
even if traffic for it appears in the private HAR. `--review-origin` changes
|
|
270
|
+
only the exact-origin filter for the same bounded structural review; it does
|
|
271
|
+
not expose raw values, broaden fixture matching, replay traffic, or make the
|
|
272
|
+
cross-origin exchange executable. Each repeat review may select only one
|
|
273
|
+
start-admitted exact origin from the same sealed bytes.
|
|
274
|
+
|
|
275
|
+
The first review stops and seals the exact inode-bound managed HAR. Browser commands are then disabled; repeat reviews and `finish` consume the same sealed bytes. Fixture values are accepted only through bounded stdin, matched only by exact primitive equality, and the result contains labels and structural locations, never the supplied values. It never performs substring probes. Credential-like query, form, JSON, path, header, cookie, authorization, session, signature, CSRF/XSRF, and token material is opaque. Bounded traversal reports `truncated: true` whenever searchable content was omitted, including oversized URLs, query values, JSON or text, capped parameters or containers, forms, and multipart bodies.
|
|
276
|
+
|
|
277
|
+
Field-name input is parsed and rejected before the recorder is sealed.
|
|
278
|
+
Invalid, duplicate, credential-like, oversized, or malformed candidates cannot
|
|
279
|
+
change derivation lifecycle state.
|
|
280
|
+
|
|
281
|
+
Review cannot replay a request or generate executable transport. Use the returned locations only to implement and test an owned parser and request builder.
|
|
282
|
+
|
|
283
|
+
## Finish and remove the raw capture
|
|
284
|
+
|
|
285
|
+
```sh
|
|
286
|
+
ghostget derive finish <id> --output /absolute/private/linkedin-web-capture
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Finish analyzes and scaffolds the derivation target origin by default. A prior
|
|
290
|
+
`derive review --review-origin` selection is never remembered. To finish an
|
|
291
|
+
intentionally cross-origin exchange, select its one canonical origin again:
|
|
292
|
+
|
|
293
|
+
```sh
|
|
294
|
+
ghostget derive finish <id> \
|
|
295
|
+
--review-origin https://upload.example.net \
|
|
296
|
+
--output /absolute/private/example-upload-capture
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
The selected hostname must be covered by the immutable `--domains` admission
|
|
300
|
+
from `derive start`. Ghostget rejects an invalid or unadmitted finish origin
|
|
301
|
+
before it seals the recorder or mutates scaffold output. The selected origin is
|
|
302
|
+
the target for both sanitized evidence reports and `wrench-adapter.json`.
|
|
303
|
+
`--platform` independently selects reviewed surface metadata; it does not
|
|
304
|
+
select, broaden, or remember the finish origin.
|
|
305
|
+
|
|
306
|
+
Successful finish writes four mode-private artifacts and deletes the managed raw HAR:
|
|
307
|
+
|
|
308
|
+
- `internal-api-evidence.json` retains exact first-party method/path structure, safe query and header names, anonymous request/response field paths, status codes, and registered-operation revisions.
|
|
309
|
+
- `derivation.candidates.json` retains the more conservative generic structural report.
|
|
310
|
+
- `wrench-adapter.json` is an empty scaffold. It does not contain an executable client.
|
|
311
|
+
- `reviewed-template.reservation.json` binds the candidate evidence hash to a non-executable review checklist. It never promotes captured traffic automatically.
|
|
312
|
+
|
|
313
|
+
Both evidence reports are inert and `reviewRequired`. They omit cookies, header values, URL values, body values, response values, and cross-origin paths. Inspect them for accidental identifying names before sharing or committing them. Normally keep them in private temporary state and transfer only the reviewed contract facts into source.
|
|
314
|
+
|
|
315
|
+
Discard an abandoned session:
|
|
316
|
+
|
|
317
|
+
```sh
|
|
318
|
+
ghostget derive discard <id> --yes
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Discard is also the recovery path for init-only, unready, or post-reboot sessions. It closes an identity-bound live helper before deleting state and refuses cleanup if that close cannot be proved; when the exact ephemeral socket has disappeared, it can remove the retained private session safely. Browser, review, and finish always require a live socket and a valid readiness boundary.
|
|
322
|
+
|
|
323
|
+
`ghostget derive analyze <har> ...` can inspect an external HAR, but it cannot attest to or delete that file. Store it privately and delete it immediately after review.
|
|
324
|
+
|
|
325
|
+
## Create a fail-closed provider scaffold
|
|
326
|
+
|
|
327
|
+
After reviewing one candidate, follow
|
|
328
|
+
[code-owned-provider-scaffold.md](code-owned-provider-scaffold.md). Pass the
|
|
329
|
+
private sanitized `internal-api-evidence.json` and exact candidate index to
|
|
330
|
+
`scripts/scaffold-web-provider.ts`. The command binds the evidence hash into a
|
|
331
|
+
private promotion checklist and creates a schema-v4 provider, runtime, manifest,
|
|
332
|
+
and tests that all fail before auth or network I/O.
|
|
333
|
+
|
|
334
|
+
The scaffold deliberately does not copy an endpoint, request value, response
|
|
335
|
+
value, or browser step into executable code. It is a code-review starting point,
|
|
336
|
+
not a generated client and not evidence that an operation is observed.
|
|
337
|
+
|
|
338
|
+
## Promote evidence into a reviewed contract
|
|
339
|
+
|
|
340
|
+
Add or update a code-owned site/action contract for every executable operation; a manifest may only select that contract. A generic schema-v5 manifest may retain a `capture-required` reservation, but generated evidence and reservations never supply an executable exchange. Manifest validation rejects every schema-v5 v1 `reviewed` template, including apparent R1 reads, until contractVersion 2 adds a reviewed current-account identity preflight and response-scope binding.
|
|
341
|
+
|
|
342
|
+
Apply these rules to either executable form:
|
|
343
|
+
|
|
344
|
+
1. Keep the registry entry `capture-required` while any request, response, token, target, actor, or account fact is unknown.
|
|
345
|
+
2. Bind one exact origin, method, path structure, allowed query names, body field shape, and timeout/response bounds.
|
|
346
|
+
3. Encode all user-controlled path, query, and body values from typed operation inputs. Reject unknown fields and ambiguous target forms.
|
|
347
|
+
4. Allow cookies through the authenticated session layer, never as manifest literals.
|
|
348
|
+
5. Route a current CSRF or authorization value only from its reviewed cookie, meta, storage, or captured-header source to its fixed header sink.
|
|
349
|
+
6. Resolve registered-operation revisions by an exact operation prefix and require one unique current candidate.
|
|
350
|
+
7. Declare every exact successful status and content-type pair. Reject redirects, alternate origins, unexpected content types, oversized responses, and undeclared success shapes.
|
|
351
|
+
8. Project only bounded fields needed by the semantic result.
|
|
352
|
+
9. Bind response fields to the requested target and, for mutations, to the expected actor and created/updated object.
|
|
353
|
+
10. Bind the auth realm to the current provider account through a reviewed viewer/account request. Fail before dispatch on missing, ambiguous, or mismatched identity.
|
|
354
|
+
|
|
355
|
+
Set the contract to observed only when the evidence and deterministic tests support every fact. “The UI worked” is not contract evidence.
|
|
356
|
+
|
|
357
|
+
## Install only a bounded semantic contract
|
|
358
|
+
|
|
359
|
+
A LinkedIn/X schema-v4 adapter selects the reviewed code-owned contract:
|
|
360
|
+
|
|
361
|
+
```json
|
|
362
|
+
{
|
|
363
|
+
"webSession": {
|
|
364
|
+
"site": "linkedin",
|
|
365
|
+
"action": "messaging.list",
|
|
366
|
+
"contractVersion": 1,
|
|
367
|
+
"timeoutMs": 60000,
|
|
368
|
+
"maxOutputBytes": 4194304
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
That schema-v4 manifest cannot provide an endpoint, method, header, body template, token source, projection, or response binding. A generic schema-v5 v1 manifest carries only non-executable `capture-required` reviewer guidance; `reviewed-template.reservation.json` is inert evidence, not a request template or generated client. Increment the adapter version—and the owned contract version for schema v4—when any executable request or response fact changes so pending work becomes stale.
|
|
374
|
+
|
|
375
|
+
## Forward-test the contract
|
|
376
|
+
|
|
377
|
+
Use a fresh signed-in realm and low-stakes fixture:
|
|
378
|
+
|
|
379
|
+
1. Validate and install the schema-v4 code-owned adapter, or validate a schema-v5 `capture-required` reservation as inert output. Require every schema-v5 v1 `reviewed` template to fail validation while `capture-required` reservations remain non-executable.
|
|
380
|
+
2. Verify the expected account binding before any private read or dispatch.
|
|
381
|
+
3. Run each R1 operation with a small page bound. Confirm that no incidental acknowledgement endpoint was requested.
|
|
382
|
+
4. For a code-owned R2/R3 operation, preview each authorized payload and compare target, actor, content, attachments, risk, auth realm, contract hash, and dispatch schedule to intent.
|
|
383
|
+
5. Confirm a code-owned mutation once. Require an exact declared response variant and target/actor binding.
|
|
384
|
+
6. Inspect provider-visible state independently.
|
|
385
|
+
7. Repeat the identical invocation within `dedupeWindowMs`; require refusal before any request.
|
|
386
|
+
8. Simulate missing cookies, token ambiguity, registered-query drift, account mismatch, redirect, status/content-type drift, response-binding failure, timeout, and oversized output. Require failure with no DOM fallback.
|
|
387
|
+
9. Simulate uncertainty after request dispatch. Require `indeterminate` or `partial`, preserve the ledger, and do not retry.
|
|
388
|
+
10. Scan plans, receipts, logs, and temporary files for credentials, content values, captured authorization, account-private URLs, and raw HAR material.
|
|
389
|
+
|
|
390
|
+
Forward-test the skill with a fresh agent given only this skill path and a realistic capture task. Do not disclose the expected endpoint, token source, risk, or implementation beforehand.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"collectionKey": "hraness-social-profile-statistics",
|
|
4
|
+
"execution": { "order": "sequential", "observationMode": "live-only" },
|
|
5
|
+
"accounts": [
|
|
6
|
+
{
|
|
7
|
+
"accountKey": "x-hraness",
|
|
8
|
+
"reads": [
|
|
9
|
+
{
|
|
10
|
+
"adapter": "x-web",
|
|
11
|
+
"operation": "profiles.read",
|
|
12
|
+
"authority": { "kind": "auth", "authId": "x-chrome" },
|
|
13
|
+
"input": { "handle": "hraness" },
|
|
14
|
+
"expectedOutput": { "provider": "x", "targetUrl": "https://x.com/hraness" },
|
|
15
|
+
"metricKeys": ["followers", "following"],
|
|
16
|
+
"expectedCategoricalGaps": [],
|
|
17
|
+
"requiredDelayBeforeMs": 0,
|
|
18
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"accountKey": "x-lifedaysleft",
|
|
24
|
+
"reads": [
|
|
25
|
+
{
|
|
26
|
+
"adapter": "x-web",
|
|
27
|
+
"operation": "profiles.read",
|
|
28
|
+
"authority": { "kind": "auth", "authId": "x-chrome" },
|
|
29
|
+
"input": { "handle": "lifedaysleft" },
|
|
30
|
+
"expectedOutput": { "provider": "x", "targetUrl": "https://x.com/lifedaysleft" },
|
|
31
|
+
"metricKeys": ["followers", "following"],
|
|
32
|
+
"expectedCategoricalGaps": [],
|
|
33
|
+
"requiredDelayBeforeMs": 0,
|
|
34
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"accountKey": "linkedin-personal",
|
|
40
|
+
"reads": [
|
|
41
|
+
{
|
|
42
|
+
"adapter": "linkedin-web",
|
|
43
|
+
"operation": "profiles.read",
|
|
44
|
+
"authority": { "kind": "auth", "authId": "linkedin-chrome" },
|
|
45
|
+
"input": {
|
|
46
|
+
"profile_url": "https://www.linkedin.com/in/hraness",
|
|
47
|
+
"include_connections": true
|
|
48
|
+
},
|
|
49
|
+
"expectedOutput": {
|
|
50
|
+
"provider": "linkedin",
|
|
51
|
+
"targetUrl": "https://www.linkedin.com/in/hraness/"
|
|
52
|
+
},
|
|
53
|
+
"metricKeys": ["followers", "connections"],
|
|
54
|
+
"expectedCategoricalGaps": [],
|
|
55
|
+
"requiredDelayBeforeMs": 0,
|
|
56
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"accountKey": "linkedin-company-hraness",
|
|
62
|
+
"reads": [
|
|
63
|
+
{
|
|
64
|
+
"adapter": "linkedin-web",
|
|
65
|
+
"operation": "organizations.read",
|
|
66
|
+
"authority": { "kind": "auth", "authId": "linkedin-chrome" },
|
|
67
|
+
"input": { "organization_url": "https://www.linkedin.com/company/hraness" },
|
|
68
|
+
"expectedOutput": {
|
|
69
|
+
"provider": "linkedin",
|
|
70
|
+
"targetUrl": "https://www.linkedin.com/company/hraness/"
|
|
71
|
+
},
|
|
72
|
+
"metricKeys": ["followers"],
|
|
73
|
+
"expectedCategoricalGaps": [],
|
|
74
|
+
"requiredDelayBeforeMs": 60000,
|
|
75
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"accountKey": "youtube-hraness",
|
|
81
|
+
"reads": [
|
|
82
|
+
{
|
|
83
|
+
"adapter": "youtube-web",
|
|
84
|
+
"operation": "profiles.read",
|
|
85
|
+
"authority": { "kind": "auth", "authId": "youtube-chrome" },
|
|
86
|
+
"input": { "profile": "@hraness" },
|
|
87
|
+
"expectedOutput": { "provider": "youtube", "targetUrl": "https://www.youtube.com/@hraness" },
|
|
88
|
+
"metricKeys": ["subscribers", "videos", "views"],
|
|
89
|
+
"expectedCategoricalGaps": [],
|
|
90
|
+
"requiredDelayBeforeMs": 0,
|
|
91
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"accountKey": "twitch-hranessdotcom",
|
|
97
|
+
"reads": [
|
|
98
|
+
{
|
|
99
|
+
"adapter": "twitch-web",
|
|
100
|
+
"operation": "profiles.read",
|
|
101
|
+
"authority": { "kind": "auth", "authId": "twitch-chrome" },
|
|
102
|
+
"input": { "profile": "hranessdotcom" },
|
|
103
|
+
"expectedOutput": { "provider": "twitch", "targetUrl": "https://www.twitch.tv/hranessdotcom" },
|
|
104
|
+
"metricKeys": ["followers"],
|
|
105
|
+
"expectedCategoricalGaps": [],
|
|
106
|
+
"requiredDelayBeforeMs": 0,
|
|
107
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"accountKey": "bluesky-hraness",
|
|
113
|
+
"reads": [
|
|
114
|
+
{
|
|
115
|
+
"adapter": "bluesky-web",
|
|
116
|
+
"operation": "profiles.read",
|
|
117
|
+
"authority": { "kind": "public" },
|
|
118
|
+
"input": { "handle": "hraness.bsky.social" },
|
|
119
|
+
"expectedOutput": {
|
|
120
|
+
"provider": "bluesky",
|
|
121
|
+
"targetUrl": "https://bsky.app/profile/hraness.bsky.social"
|
|
122
|
+
},
|
|
123
|
+
"metricKeys": ["followers", "following", "posts"],
|
|
124
|
+
"expectedCategoricalGaps": [],
|
|
125
|
+
"requiredDelayBeforeMs": 0,
|
|
126
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"accountKey": "instagram-hraness",
|
|
132
|
+
"reads": [
|
|
133
|
+
{
|
|
134
|
+
"adapter": "instagram-web",
|
|
135
|
+
"operation": "profiles.read",
|
|
136
|
+
"authority": { "kind": "auth", "authId": "instagram-chrome" },
|
|
137
|
+
"input": { "profile": "hraness" },
|
|
138
|
+
"expectedOutput": {
|
|
139
|
+
"provider": "instagram",
|
|
140
|
+
"targetUrl": "https://www.instagram.com/hraness/"
|
|
141
|
+
},
|
|
142
|
+
"metricKeys": ["followers", "following", "posts"],
|
|
143
|
+
"expectedCategoricalGaps": [],
|
|
144
|
+
"requiredDelayBeforeMs": 0,
|
|
145
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"accountKey": "threads-hraness",
|
|
151
|
+
"reads": [
|
|
152
|
+
{
|
|
153
|
+
"adapter": "threads-web",
|
|
154
|
+
"operation": "profiles.read",
|
|
155
|
+
"authority": { "kind": "auth", "authId": "threads-chrome" },
|
|
156
|
+
"input": { "profile": "hraness" },
|
|
157
|
+
"expectedOutput": {
|
|
158
|
+
"provider": "threads",
|
|
159
|
+
"targetUrl": "https://www.threads.com/@hraness"
|
|
160
|
+
},
|
|
161
|
+
"metricKeys": ["followers", "recentViews"],
|
|
162
|
+
"expectedCategoricalGaps": [
|
|
163
|
+
{
|
|
164
|
+
"metricKey": "recentViews",
|
|
165
|
+
"reason": "not-authorized",
|
|
166
|
+
"until": "account-eligible"
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"requiredDelayBeforeMs": 0,
|
|
170
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"accountKey": "substack-hraness",
|
|
176
|
+
"reads": [
|
|
177
|
+
{
|
|
178
|
+
"adapter": "substack-web",
|
|
179
|
+
"operation": "profiles.read",
|
|
180
|
+
"authority": { "kind": "auth", "authId": "substack-chrome" },
|
|
181
|
+
"input": { "profile": "hraness" },
|
|
182
|
+
"expectedOutput": { "provider": "substack", "targetUrl": "https://substack.com/@hraness" },
|
|
183
|
+
"metricKeys": ["followers"],
|
|
184
|
+
"expectedCategoricalGaps": [],
|
|
185
|
+
"requiredDelayBeforeMs": 0,
|
|
186
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"adapter": "substack-web",
|
|
190
|
+
"operation": "organizations.read",
|
|
191
|
+
"authority": { "kind": "auth", "authId": "substack-chrome" },
|
|
192
|
+
"input": { "organization": "hraness" },
|
|
193
|
+
"expectedOutput": {
|
|
194
|
+
"provider": "substack",
|
|
195
|
+
"targetUrl": "https://hraness.substack.com/"
|
|
196
|
+
},
|
|
197
|
+
"metricKeys": ["freeSubscribers", "paidSubscribers"],
|
|
198
|
+
"expectedCategoricalGaps": [],
|
|
199
|
+
"requiredDelayBeforeMs": 0,
|
|
200
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"accountKey": "github-0thernet",
|
|
206
|
+
"reads": [
|
|
207
|
+
{
|
|
208
|
+
"adapter": "github-web",
|
|
209
|
+
"operation": "profiles.read",
|
|
210
|
+
"authority": { "kind": "public" },
|
|
211
|
+
"input": { "username": "0thernet" },
|
|
212
|
+
"expectedOutput": { "provider": "github", "targetUrl": "https://github.com/0thernet" },
|
|
213
|
+
"metricKeys": ["followers", "following", "publicRepositories"],
|
|
214
|
+
"expectedCategoricalGaps": [],
|
|
215
|
+
"requiredDelayBeforeMs": 0,
|
|
216
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"accountKey": "github-hraness",
|
|
222
|
+
"reads": [
|
|
223
|
+
{
|
|
224
|
+
"adapter": "github-web",
|
|
225
|
+
"operation": "organizations.read",
|
|
226
|
+
"authority": { "kind": "public" },
|
|
227
|
+
"input": { "organization": "hraness" },
|
|
228
|
+
"expectedOutput": { "provider": "github", "targetUrl": "https://github.com/hraness" },
|
|
229
|
+
"metricKeys": ["stars", "followers"],
|
|
230
|
+
"expectedCategoricalGaps": [],
|
|
231
|
+
"requiredDelayBeforeMs": 0,
|
|
232
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"accountKey": "tiktok-hraness",
|
|
238
|
+
"reads": [
|
|
239
|
+
{
|
|
240
|
+
"adapter": "tiktok-web",
|
|
241
|
+
"operation": "profiles.read",
|
|
242
|
+
"authority": { "kind": "auth", "authId": "tiktok-chrome" },
|
|
243
|
+
"input": { "profile": "hraness" },
|
|
244
|
+
"expectedOutput": { "provider": "tiktok", "targetUrl": "https://www.tiktok.com/@hraness" },
|
|
245
|
+
"metricKeys": ["followers", "following", "likes"],
|
|
246
|
+
"expectedCategoricalGaps": [],
|
|
247
|
+
"requiredDelayBeforeMs": 0,
|
|
248
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"accountKey": "reddit-bgdotjpg",
|
|
254
|
+
"reads": [
|
|
255
|
+
{
|
|
256
|
+
"adapter": "reddit-web",
|
|
257
|
+
"operation": "profiles.read",
|
|
258
|
+
"authority": { "kind": "auth", "authId": "reddit-chrome" },
|
|
259
|
+
"input": { "profile": "bgdotjpg" },
|
|
260
|
+
"expectedOutput": { "provider": "reddit", "targetUrl": "https://www.reddit.com/user/bgdotjpg/" },
|
|
261
|
+
"metricKeys": ["followers", "karma", "contributions"],
|
|
262
|
+
"expectedCategoricalGaps": [],
|
|
263
|
+
"requiredDelayBeforeMs": 0,
|
|
264
|
+
"semantics": { "state": "observed", "risk": "R1", "sideEffect": "none" }
|
|
265
|
+
}
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
}
|