@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,902 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 4,
|
|
3
|
+
"id": "substack-web",
|
|
4
|
+
"version": "1.3.0",
|
|
5
|
+
"displayName": "Substack (Authenticated Web API)",
|
|
6
|
+
"surfaceId": "substack",
|
|
7
|
+
"origins": [
|
|
8
|
+
"https://substack.com"
|
|
9
|
+
],
|
|
10
|
+
"browserDomains": [
|
|
11
|
+
"substack.com"
|
|
12
|
+
],
|
|
13
|
+
"operations": {
|
|
14
|
+
"feeds.read": {
|
|
15
|
+
"description": "Observed contract: read and project one bounded first page from the current Substack Notes, inbox, or reader-post feed without acknowledgement writes.",
|
|
16
|
+
"risk": "R1",
|
|
17
|
+
"sideEffect": "none",
|
|
18
|
+
"idempotency": "none",
|
|
19
|
+
"dedupeWindowMs": 0,
|
|
20
|
+
"input": {
|
|
21
|
+
"properties": {
|
|
22
|
+
"feed": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "Exact reviewed Substack central feed",
|
|
25
|
+
"enum": [
|
|
26
|
+
"notes",
|
|
27
|
+
"inbox",
|
|
28
|
+
"reader-posts"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"limit": {
|
|
32
|
+
"type": "number",
|
|
33
|
+
"description": "Maximum entities projected from the complete first-party page",
|
|
34
|
+
"minimum": 1,
|
|
35
|
+
"maximum": 100
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"required": [
|
|
39
|
+
"feed"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"webSession": {
|
|
43
|
+
"site": "substack",
|
|
44
|
+
"action": "feeds.read",
|
|
45
|
+
"contractVersion": 1,
|
|
46
|
+
"timeoutMs": 60000,
|
|
47
|
+
"maxOutputBytes": 8388608
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"posts.read": {
|
|
51
|
+
"description": "Observed contract: read one exact Substack Note through the target-bound central reader endpoint.",
|
|
52
|
+
"risk": "R1",
|
|
53
|
+
"sideEffect": "none",
|
|
54
|
+
"idempotency": "none",
|
|
55
|
+
"dedupeWindowMs": 0,
|
|
56
|
+
"input": {
|
|
57
|
+
"properties": {
|
|
58
|
+
"note_id": {
|
|
59
|
+
"type": "number",
|
|
60
|
+
"description": "Exact positive Substack Note ID",
|
|
61
|
+
"minimum": 1,
|
|
62
|
+
"maximum": 9007199254740991
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"required": [
|
|
66
|
+
"note_id"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"webSession": {
|
|
70
|
+
"site": "substack",
|
|
71
|
+
"action": "posts.read",
|
|
72
|
+
"contractVersion": 1,
|
|
73
|
+
"timeoutMs": 60000,
|
|
74
|
+
"maxOutputBytes": 8388608
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"articles.read": {
|
|
78
|
+
"description": "Observed contract: read one exact entitled Substack article, including bounded body HTML, through the target-bound central post endpoint.",
|
|
79
|
+
"risk": "R1",
|
|
80
|
+
"sideEffect": "none",
|
|
81
|
+
"idempotency": "none",
|
|
82
|
+
"dedupeWindowMs": 0,
|
|
83
|
+
"input": {
|
|
84
|
+
"properties": {
|
|
85
|
+
"article_id": {
|
|
86
|
+
"type": "number",
|
|
87
|
+
"description": "Exact positive Substack article ID",
|
|
88
|
+
"minimum": 1,
|
|
89
|
+
"maximum": 9007199254740991
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"required": [
|
|
93
|
+
"article_id"
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"webSession": {
|
|
97
|
+
"site": "substack",
|
|
98
|
+
"action": "articles.read",
|
|
99
|
+
"contractVersion": 1,
|
|
100
|
+
"timeoutMs": 60000,
|
|
101
|
+
"maxOutputBytes": 8388608
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"comments.read": {
|
|
105
|
+
"description": "Observed contract: read one bounded article reply page after independently binding the requested article to its exact publication.",
|
|
106
|
+
"risk": "R1",
|
|
107
|
+
"sideEffect": "none",
|
|
108
|
+
"idempotency": "none",
|
|
109
|
+
"dedupeWindowMs": 0,
|
|
110
|
+
"input": {
|
|
111
|
+
"properties": {
|
|
112
|
+
"article_id": {
|
|
113
|
+
"type": "number",
|
|
114
|
+
"description": "Exact positive Substack article ID",
|
|
115
|
+
"minimum": 1,
|
|
116
|
+
"maximum": 9007199254740991
|
|
117
|
+
},
|
|
118
|
+
"publication_id": {
|
|
119
|
+
"type": "number",
|
|
120
|
+
"description": "Exact publication ID independently checked against the article",
|
|
121
|
+
"minimum": 1,
|
|
122
|
+
"maximum": 9007199254740991
|
|
123
|
+
},
|
|
124
|
+
"cursor": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"description": "Opaque cursor returned by the preceding reply page",
|
|
127
|
+
"minLength": 1,
|
|
128
|
+
"maxLength": 4096
|
|
129
|
+
},
|
|
130
|
+
"limit": {
|
|
131
|
+
"type": "number",
|
|
132
|
+
"description": "Maximum comments projected",
|
|
133
|
+
"minimum": 1,
|
|
134
|
+
"maximum": 100
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"required": [
|
|
138
|
+
"article_id",
|
|
139
|
+
"publication_id"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"webSession": {
|
|
143
|
+
"site": "substack",
|
|
144
|
+
"action": "comments.read",
|
|
145
|
+
"contractVersion": 1,
|
|
146
|
+
"timeoutMs": 60000,
|
|
147
|
+
"maxOutputBytes": 8388608
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"media.read": {
|
|
151
|
+
"description": "Observed contract: project bounded cover, podcast, video-upload, API audio-item, and exact same-publication inline audio metadata from one exact entitled Substack article response.",
|
|
152
|
+
"risk": "R1",
|
|
153
|
+
"sideEffect": "none",
|
|
154
|
+
"idempotency": "none",
|
|
155
|
+
"dedupeWindowMs": 0,
|
|
156
|
+
"input": {
|
|
157
|
+
"properties": {
|
|
158
|
+
"article_id": {
|
|
159
|
+
"type": "number",
|
|
160
|
+
"description": "Exact positive Substack article ID",
|
|
161
|
+
"minimum": 1,
|
|
162
|
+
"maximum": 9007199254740991
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"required": [
|
|
166
|
+
"article_id"
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
"webSession": {
|
|
170
|
+
"site": "substack",
|
|
171
|
+
"action": "media.read",
|
|
172
|
+
"contractVersion": 1,
|
|
173
|
+
"timeoutMs": 60000,
|
|
174
|
+
"maxOutputBytes": 8388608
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"media.publish": {
|
|
178
|
+
"description": "Capture-required contract reservation: publish one confirmed Substack Note with one MP4 only after exact upload initialization, byte transfer, processing, viewer binding, public Note creation, returned-entity attachment binding, and independent exact-Note readback are reviewed; this is not article or newsletter publication.",
|
|
179
|
+
"risk": "R3",
|
|
180
|
+
"sideEffect": "Uploads one video and publishes one externally visible Substack Note with the exact confirmed body.",
|
|
181
|
+
"idempotency": "local-at-most-once",
|
|
182
|
+
"dedupeWindowMs": 86400000,
|
|
183
|
+
"input": {
|
|
184
|
+
"properties": {
|
|
185
|
+
"body": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"description": "Exact Note body",
|
|
188
|
+
"minLength": 1,
|
|
189
|
+
"maxLength": 500
|
|
190
|
+
},
|
|
191
|
+
"media": {
|
|
192
|
+
"type": "file",
|
|
193
|
+
"description": "Exact plan-bound Substack Note MP4",
|
|
194
|
+
"maxBytes": 536870912,
|
|
195
|
+
"mediaTypes": [
|
|
196
|
+
"video/mp4"
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"required": [
|
|
201
|
+
"body",
|
|
202
|
+
"media"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
"webSession": {
|
|
206
|
+
"site": "substack",
|
|
207
|
+
"action": "media.publish",
|
|
208
|
+
"contractVersion": 1,
|
|
209
|
+
"timeoutMs": 600000,
|
|
210
|
+
"maxOutputBytes": 8388608
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"messaging.list": {
|
|
214
|
+
"description": "Observed contract: list one bounded Substack inbox tab without sending read acknowledgements, presence, or typing state.",
|
|
215
|
+
"risk": "R1",
|
|
216
|
+
"sideEffect": "none",
|
|
217
|
+
"idempotency": "none",
|
|
218
|
+
"dedupeWindowMs": 0,
|
|
219
|
+
"input": {
|
|
220
|
+
"properties": {
|
|
221
|
+
"folder": {
|
|
222
|
+
"type": "string",
|
|
223
|
+
"description": "Exact current Substack inbox tab",
|
|
224
|
+
"enum": [
|
|
225
|
+
"all",
|
|
226
|
+
"people",
|
|
227
|
+
"unread"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
"cursor": {
|
|
231
|
+
"type": "string",
|
|
232
|
+
"description": "Opaque cursor returned by the preceding inbox page",
|
|
233
|
+
"minLength": 1,
|
|
234
|
+
"maxLength": 4096
|
|
235
|
+
},
|
|
236
|
+
"limit": {
|
|
237
|
+
"type": "number",
|
|
238
|
+
"description": "Maximum inbox threads projected",
|
|
239
|
+
"minimum": 1,
|
|
240
|
+
"maximum": 100
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"required": [
|
|
244
|
+
"folder"
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"webSession": {
|
|
248
|
+
"site": "substack",
|
|
249
|
+
"action": "messaging.list",
|
|
250
|
+
"contractVersion": 1,
|
|
251
|
+
"timeoutMs": 60000,
|
|
252
|
+
"maxOutputBytes": 8388608
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
"profiles.read": {
|
|
256
|
+
"description": "Observed contract: read one exact target-bound Substack profile follower count with current-viewer ID binding.",
|
|
257
|
+
"risk": "R1",
|
|
258
|
+
"sideEffect": "none",
|
|
259
|
+
"idempotency": "none",
|
|
260
|
+
"dedupeWindowMs": 0,
|
|
261
|
+
"input": {
|
|
262
|
+
"properties": {
|
|
263
|
+
"profile": {
|
|
264
|
+
"type": "string",
|
|
265
|
+
"description": "Canonical lowercase Substack profile handle bound to the signed-in viewer",
|
|
266
|
+
"minLength": 1,
|
|
267
|
+
"maxLength": 128
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"required": [
|
|
271
|
+
"profile"
|
|
272
|
+
]
|
|
273
|
+
},
|
|
274
|
+
"webSession": {
|
|
275
|
+
"site": "substack",
|
|
276
|
+
"action": "profiles.read",
|
|
277
|
+
"contractVersion": 1,
|
|
278
|
+
"timeoutMs": 60000,
|
|
279
|
+
"maxOutputBytes": 8388608
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
"organizations.read": {
|
|
283
|
+
"description": "Observed contract: read exact free and paid subscriber counts from one bootstrap-bound viewer-owned Substack publication summary.",
|
|
284
|
+
"risk": "R1",
|
|
285
|
+
"sideEffect": "none",
|
|
286
|
+
"idempotency": "none",
|
|
287
|
+
"dedupeWindowMs": 0,
|
|
288
|
+
"input": {
|
|
289
|
+
"properties": {
|
|
290
|
+
"organization": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"description": "Canonical lowercase viewer-owned Substack publication subdomain",
|
|
293
|
+
"minLength": 1,
|
|
294
|
+
"maxLength": 63
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
"required": [
|
|
298
|
+
"organization"
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
"webSession": {
|
|
302
|
+
"site": "substack",
|
|
303
|
+
"action": "organizations.read",
|
|
304
|
+
"contractVersion": 1,
|
|
305
|
+
"timeoutMs": 60000,
|
|
306
|
+
"maxOutputBytes": 8388608
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
"messaging.read": {
|
|
310
|
+
"description": "Capture-required contract reservation: read one exact Substack direct-message thread only after a real low-stakes fixture proves the GET has no acknowledgement side effect.",
|
|
311
|
+
"risk": "R1",
|
|
312
|
+
"sideEffect": "none",
|
|
313
|
+
"idempotency": "none",
|
|
314
|
+
"dedupeWindowMs": 0,
|
|
315
|
+
"input": {
|
|
316
|
+
"properties": {
|
|
317
|
+
"thread_id": {
|
|
318
|
+
"type": "string",
|
|
319
|
+
"description": "Exact opaque Substack thread ID returned by messaging.list",
|
|
320
|
+
"minLength": 1,
|
|
321
|
+
"maxLength": 512
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
"required": [
|
|
325
|
+
"thread_id"
|
|
326
|
+
]
|
|
327
|
+
},
|
|
328
|
+
"webSession": {
|
|
329
|
+
"site": "substack",
|
|
330
|
+
"action": "messaging.read",
|
|
331
|
+
"contractVersion": 1,
|
|
332
|
+
"timeoutMs": 60000,
|
|
333
|
+
"maxOutputBytes": 8388608
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"likes.set": {
|
|
337
|
+
"description": "Capture-required contract reservation: set one exact Substack post or Note/comment heart state after target-specific desired-state readback is proven.",
|
|
338
|
+
"risk": "R2",
|
|
339
|
+
"sideEffect": "Sets or clears the authenticated user's heart reaction on the exact confirmed Substack target.",
|
|
340
|
+
"idempotency": "local-at-most-once",
|
|
341
|
+
"dedupeWindowMs": 86400000,
|
|
342
|
+
"input": {
|
|
343
|
+
"properties": {
|
|
344
|
+
"target_type": {
|
|
345
|
+
"type": "string",
|
|
346
|
+
"description": "Target-specific reaction contract",
|
|
347
|
+
"enum": [
|
|
348
|
+
"article",
|
|
349
|
+
"note",
|
|
350
|
+
"comment"
|
|
351
|
+
]
|
|
352
|
+
},
|
|
353
|
+
"target_id": {
|
|
354
|
+
"type": "number",
|
|
355
|
+
"description": "Exact positive target ID",
|
|
356
|
+
"minimum": 1,
|
|
357
|
+
"maximum": 9007199254740991
|
|
358
|
+
},
|
|
359
|
+
"liked": {
|
|
360
|
+
"type": "boolean",
|
|
361
|
+
"description": "Exact desired heart state"
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"required": [
|
|
365
|
+
"target_type",
|
|
366
|
+
"target_id",
|
|
367
|
+
"liked"
|
|
368
|
+
]
|
|
369
|
+
},
|
|
370
|
+
"webSession": {
|
|
371
|
+
"site": "substack",
|
|
372
|
+
"action": "likes.set",
|
|
373
|
+
"contractVersion": 1,
|
|
374
|
+
"timeoutMs": 60000,
|
|
375
|
+
"maxOutputBytes": 2097152
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"content.save": {
|
|
379
|
+
"description": "Capture-required contract reservation: set one exact Substack article or Note saved state after target-specific independent readback is proven.",
|
|
380
|
+
"risk": "R2",
|
|
381
|
+
"sideEffect": "Saves or removes the exact confirmed Substack article or Note in the authenticated user's library.",
|
|
382
|
+
"idempotency": "local-at-most-once",
|
|
383
|
+
"dedupeWindowMs": 86400000,
|
|
384
|
+
"input": {
|
|
385
|
+
"properties": {
|
|
386
|
+
"target_type": {
|
|
387
|
+
"type": "string",
|
|
388
|
+
"description": "Target-specific save contract",
|
|
389
|
+
"enum": [
|
|
390
|
+
"article",
|
|
391
|
+
"note"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"target_id": {
|
|
395
|
+
"type": "number",
|
|
396
|
+
"description": "Exact positive target ID",
|
|
397
|
+
"minimum": 1,
|
|
398
|
+
"maximum": 9007199254740991
|
|
399
|
+
},
|
|
400
|
+
"saved": {
|
|
401
|
+
"type": "boolean",
|
|
402
|
+
"description": "Exact desired saved state"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"required": [
|
|
406
|
+
"target_type",
|
|
407
|
+
"target_id",
|
|
408
|
+
"saved"
|
|
409
|
+
]
|
|
410
|
+
},
|
|
411
|
+
"webSession": {
|
|
412
|
+
"site": "substack",
|
|
413
|
+
"action": "content.save",
|
|
414
|
+
"contractVersion": 1,
|
|
415
|
+
"timeoutMs": 60000,
|
|
416
|
+
"maxOutputBytes": 2097152
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
"relationships.follow.set": {
|
|
420
|
+
"description": "Capture-required contract reservation: set one exact free user-follow or publication-subscription state; paid, pledge, purchase, email, and access changes remain blocked.",
|
|
421
|
+
"risk": "R2",
|
|
422
|
+
"sideEffect": "Sets or clears one exact free Substack follow/subscription relationship without changing billing or email settings.",
|
|
423
|
+
"idempotency": "local-at-most-once",
|
|
424
|
+
"dedupeWindowMs": 86400000,
|
|
425
|
+
"input": {
|
|
426
|
+
"properties": {
|
|
427
|
+
"target_type": {
|
|
428
|
+
"type": "string",
|
|
429
|
+
"description": "Free relationship type",
|
|
430
|
+
"enum": [
|
|
431
|
+
"user",
|
|
432
|
+
"publication"
|
|
433
|
+
]
|
|
434
|
+
},
|
|
435
|
+
"target_id": {
|
|
436
|
+
"type": "number",
|
|
437
|
+
"description": "Exact positive user or publication ID",
|
|
438
|
+
"minimum": 1,
|
|
439
|
+
"maximum": 9007199254740991
|
|
440
|
+
},
|
|
441
|
+
"following": {
|
|
442
|
+
"type": "boolean",
|
|
443
|
+
"description": "Exact desired free relationship state"
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
"required": [
|
|
447
|
+
"target_type",
|
|
448
|
+
"target_id",
|
|
449
|
+
"following"
|
|
450
|
+
]
|
|
451
|
+
},
|
|
452
|
+
"webSession": {
|
|
453
|
+
"site": "substack",
|
|
454
|
+
"action": "relationships.follow.set",
|
|
455
|
+
"contractVersion": 1,
|
|
456
|
+
"timeoutMs": 60000,
|
|
457
|
+
"maxOutputBytes": 2097152
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
"messaging.send": {
|
|
461
|
+
"description": "Capture-required contract reservation: send one confirmed Substack DM to an exact existing thread or exact user after start/send response binding is reviewed.",
|
|
462
|
+
"risk": "R3",
|
|
463
|
+
"sideEffect": "Sends one externally visible direct message to the exact confirmed Substack recipient or thread.",
|
|
464
|
+
"idempotency": "local-at-most-once",
|
|
465
|
+
"dedupeWindowMs": 86400000,
|
|
466
|
+
"input": {
|
|
467
|
+
"properties": {
|
|
468
|
+
"target_type": {
|
|
469
|
+
"type": "string",
|
|
470
|
+
"description": "Send to an existing thread or start with one exact user",
|
|
471
|
+
"enum": [
|
|
472
|
+
"thread",
|
|
473
|
+
"user"
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
"target_id": {
|
|
477
|
+
"type": "string",
|
|
478
|
+
"description": "Exact thread ID or decimal user ID selected by target_type",
|
|
479
|
+
"minLength": 1,
|
|
480
|
+
"maxLength": 512
|
|
481
|
+
},
|
|
482
|
+
"body": {
|
|
483
|
+
"type": "string",
|
|
484
|
+
"description": "Exact direct-message body",
|
|
485
|
+
"minLength": 1,
|
|
486
|
+
"maxLength": 1000
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
"required": [
|
|
490
|
+
"target_type",
|
|
491
|
+
"target_id",
|
|
492
|
+
"body"
|
|
493
|
+
]
|
|
494
|
+
},
|
|
495
|
+
"webSession": {
|
|
496
|
+
"site": "substack",
|
|
497
|
+
"action": "messaging.send",
|
|
498
|
+
"contractVersion": 1,
|
|
499
|
+
"timeoutMs": 60000,
|
|
500
|
+
"maxOutputBytes": 2097152
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
"comments.create": {
|
|
504
|
+
"description": "Capture-required contract reservation: publish one confirmed top-level article comment after exact publication permissions and returned actor/post binding are reviewed.",
|
|
505
|
+
"risk": "R3",
|
|
506
|
+
"sideEffect": "Publishes one externally visible comment on the exact confirmed Substack article.",
|
|
507
|
+
"idempotency": "local-at-most-once",
|
|
508
|
+
"dedupeWindowMs": 86400000,
|
|
509
|
+
"input": {
|
|
510
|
+
"properties": {
|
|
511
|
+
"article_id": {
|
|
512
|
+
"type": "number",
|
|
513
|
+
"description": "Exact positive article ID",
|
|
514
|
+
"minimum": 1,
|
|
515
|
+
"maximum": 9007199254740991
|
|
516
|
+
},
|
|
517
|
+
"publication_id": {
|
|
518
|
+
"type": "number",
|
|
519
|
+
"description": "Exact publication ID independently bound to the article",
|
|
520
|
+
"minimum": 1,
|
|
521
|
+
"maximum": 9007199254740991
|
|
522
|
+
},
|
|
523
|
+
"body": {
|
|
524
|
+
"type": "string",
|
|
525
|
+
"description": "Exact comment body",
|
|
526
|
+
"minLength": 1,
|
|
527
|
+
"maxLength": 1000
|
|
528
|
+
}
|
|
529
|
+
},
|
|
530
|
+
"required": [
|
|
531
|
+
"article_id",
|
|
532
|
+
"publication_id",
|
|
533
|
+
"body"
|
|
534
|
+
]
|
|
535
|
+
},
|
|
536
|
+
"webSession": {
|
|
537
|
+
"site": "substack",
|
|
538
|
+
"action": "comments.create",
|
|
539
|
+
"contractVersion": 1,
|
|
540
|
+
"timeoutMs": 60000,
|
|
541
|
+
"maxOutputBytes": 2097152
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"replies.create": {
|
|
545
|
+
"description": "Capture-required contract reservation: publish one confirmed reply through an exact Note, article-comment, or chat reply contract.",
|
|
546
|
+
"risk": "R3",
|
|
547
|
+
"sideEffect": "Publishes one externally visible reply beneath the exact confirmed Substack parent.",
|
|
548
|
+
"idempotency": "local-at-most-once",
|
|
549
|
+
"dedupeWindowMs": 86400000,
|
|
550
|
+
"input": {
|
|
551
|
+
"properties": {
|
|
552
|
+
"parent_type": {
|
|
553
|
+
"type": "string",
|
|
554
|
+
"description": "Exact parent contract",
|
|
555
|
+
"enum": [
|
|
556
|
+
"note",
|
|
557
|
+
"comment",
|
|
558
|
+
"chat"
|
|
559
|
+
]
|
|
560
|
+
},
|
|
561
|
+
"parent_id": {
|
|
562
|
+
"type": "string",
|
|
563
|
+
"description": "Exact parent entity or thread ID",
|
|
564
|
+
"minLength": 1,
|
|
565
|
+
"maxLength": 512
|
|
566
|
+
},
|
|
567
|
+
"body": {
|
|
568
|
+
"type": "string",
|
|
569
|
+
"description": "Exact reply body",
|
|
570
|
+
"minLength": 1,
|
|
571
|
+
"maxLength": 1000
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
"required": [
|
|
575
|
+
"parent_type",
|
|
576
|
+
"parent_id",
|
|
577
|
+
"body"
|
|
578
|
+
]
|
|
579
|
+
},
|
|
580
|
+
"webSession": {
|
|
581
|
+
"site": "substack",
|
|
582
|
+
"action": "replies.create",
|
|
583
|
+
"contractVersion": 1,
|
|
584
|
+
"timeoutMs": 60000,
|
|
585
|
+
"maxOutputBytes": 2097152
|
|
586
|
+
}
|
|
587
|
+
},
|
|
588
|
+
"posts.publish": {
|
|
589
|
+
"description": "Observed contract: publish one confirmed Substack Note with an optional reviewed PNG after exact asset, actor, and returned-entity binding, durably retain the accepted Note ID, and poll the same exact independent readback at four bounded attempts over six seconds.",
|
|
590
|
+
"risk": "R3",
|
|
591
|
+
"sideEffect": "Publishes one externally visible Substack Note with the exact confirmed text and optional media.",
|
|
592
|
+
"idempotency": "local-at-most-once",
|
|
593
|
+
"dedupeWindowMs": 86400000,
|
|
594
|
+
"input": {
|
|
595
|
+
"properties": {
|
|
596
|
+
"body": {
|
|
597
|
+
"type": "string",
|
|
598
|
+
"description": "Exact Note body",
|
|
599
|
+
"minLength": 1,
|
|
600
|
+
"maxLength": 500
|
|
601
|
+
},
|
|
602
|
+
"media": {
|
|
603
|
+
"type": "file",
|
|
604
|
+
"description": "Optional reviewed Note PNG",
|
|
605
|
+
"maxBytes": 20971520,
|
|
606
|
+
"mediaTypes": [
|
|
607
|
+
"image/png"
|
|
608
|
+
]
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
"required": [
|
|
612
|
+
"body"
|
|
613
|
+
]
|
|
614
|
+
},
|
|
615
|
+
"webSession": {
|
|
616
|
+
"site": "substack",
|
|
617
|
+
"action": "posts.publish",
|
|
618
|
+
"contractVersion": 3,
|
|
619
|
+
"timeoutMs": 600000,
|
|
620
|
+
"maxOutputBytes": 4194304
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
"posts.quote": {
|
|
624
|
+
"description": "Capture-required contract reservation: publish one confirmed quote-Note bound to an exact source Note, comment, or article.",
|
|
625
|
+
"risk": "R3",
|
|
626
|
+
"sideEffect": "Publishes one externally visible Substack quote-Note referencing the exact confirmed source.",
|
|
627
|
+
"idempotency": "local-at-most-once",
|
|
628
|
+
"dedupeWindowMs": 86400000,
|
|
629
|
+
"input": {
|
|
630
|
+
"properties": {
|
|
631
|
+
"source_type": {
|
|
632
|
+
"type": "string",
|
|
633
|
+
"description": "Exact quoted entity type",
|
|
634
|
+
"enum": [
|
|
635
|
+
"article",
|
|
636
|
+
"note",
|
|
637
|
+
"comment"
|
|
638
|
+
]
|
|
639
|
+
},
|
|
640
|
+
"source_id": {
|
|
641
|
+
"type": "number",
|
|
642
|
+
"description": "Exact positive source entity ID",
|
|
643
|
+
"minimum": 1,
|
|
644
|
+
"maximum": 9007199254740991
|
|
645
|
+
},
|
|
646
|
+
"body": {
|
|
647
|
+
"type": "string",
|
|
648
|
+
"description": "Exact quote-Note body",
|
|
649
|
+
"minLength": 1,
|
|
650
|
+
"maxLength": 500
|
|
651
|
+
}
|
|
652
|
+
},
|
|
653
|
+
"required": [
|
|
654
|
+
"source_type",
|
|
655
|
+
"source_id",
|
|
656
|
+
"body"
|
|
657
|
+
]
|
|
658
|
+
},
|
|
659
|
+
"webSession": {
|
|
660
|
+
"site": "substack",
|
|
661
|
+
"action": "posts.quote",
|
|
662
|
+
"contractVersion": 1,
|
|
663
|
+
"timeoutMs": 60000,
|
|
664
|
+
"maxOutputBytes": 2097152
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
"posts.repost": {
|
|
668
|
+
"description": "Capture-required contract reservation: restack one exact Substack article, Note, comment, or media clip only after the returned restack entity is response-bound.",
|
|
669
|
+
"risk": "R3",
|
|
670
|
+
"sideEffect": "Creates one externally visible Substack restack of the exact confirmed source.",
|
|
671
|
+
"idempotency": "local-at-most-once",
|
|
672
|
+
"dedupeWindowMs": 86400000,
|
|
673
|
+
"input": {
|
|
674
|
+
"properties": {
|
|
675
|
+
"source_type": {
|
|
676
|
+
"type": "string",
|
|
677
|
+
"description": "Exact restack source contract",
|
|
678
|
+
"enum": [
|
|
679
|
+
"article",
|
|
680
|
+
"note",
|
|
681
|
+
"comment",
|
|
682
|
+
"media"
|
|
683
|
+
]
|
|
684
|
+
},
|
|
685
|
+
"source_id": {
|
|
686
|
+
"type": "number",
|
|
687
|
+
"description": "Exact positive source entity ID",
|
|
688
|
+
"minimum": 1,
|
|
689
|
+
"maximum": 9007199254740991
|
|
690
|
+
}
|
|
691
|
+
},
|
|
692
|
+
"required": [
|
|
693
|
+
"source_type",
|
|
694
|
+
"source_id"
|
|
695
|
+
]
|
|
696
|
+
},
|
|
697
|
+
"webSession": {
|
|
698
|
+
"site": "substack",
|
|
699
|
+
"action": "posts.repost",
|
|
700
|
+
"contractVersion": 1,
|
|
701
|
+
"timeoutMs": 60000,
|
|
702
|
+
"maxOutputBytes": 2097152
|
|
703
|
+
}
|
|
704
|
+
},
|
|
705
|
+
"content.share": {
|
|
706
|
+
"description": "Capture-required contract reservation: share one exact Substack entity to one explicitly confirmed native or external destination after destination-specific effects are reviewed.",
|
|
707
|
+
"risk": "R3",
|
|
708
|
+
"sideEffect": "Shares the exact confirmed Substack entity to the exact confirmed destination.",
|
|
709
|
+
"idempotency": "local-at-most-once",
|
|
710
|
+
"dedupeWindowMs": 86400000,
|
|
711
|
+
"input": {
|
|
712
|
+
"properties": {
|
|
713
|
+
"target_type": {
|
|
714
|
+
"type": "string",
|
|
715
|
+
"description": "Exact source entity type",
|
|
716
|
+
"enum": [
|
|
717
|
+
"article",
|
|
718
|
+
"note",
|
|
719
|
+
"comment"
|
|
720
|
+
]
|
|
721
|
+
},
|
|
722
|
+
"target_id": {
|
|
723
|
+
"type": "number",
|
|
724
|
+
"description": "Exact positive source entity ID",
|
|
725
|
+
"minimum": 1,
|
|
726
|
+
"maximum": 9007199254740991
|
|
727
|
+
},
|
|
728
|
+
"destination": {
|
|
729
|
+
"type": "string",
|
|
730
|
+
"description": "Exact share destination contract",
|
|
731
|
+
"enum": [
|
|
732
|
+
"substack",
|
|
733
|
+
"external"
|
|
734
|
+
]
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
"required": [
|
|
738
|
+
"target_type",
|
|
739
|
+
"target_id",
|
|
740
|
+
"destination"
|
|
741
|
+
]
|
|
742
|
+
},
|
|
743
|
+
"webSession": {
|
|
744
|
+
"site": "substack",
|
|
745
|
+
"action": "content.share",
|
|
746
|
+
"contractVersion": 1,
|
|
747
|
+
"timeoutMs": 60000,
|
|
748
|
+
"maxOutputBytes": 2097152
|
|
749
|
+
}
|
|
750
|
+
},
|
|
751
|
+
"content.edit": {
|
|
752
|
+
"description": "Capture-required contract reservation: edit one exact owned Substack Note, comment, draft, or article after actor ownership and independent readback are proven.",
|
|
753
|
+
"risk": "R3",
|
|
754
|
+
"sideEffect": "Changes externally visible or scheduled content owned by the authenticated Substack user.",
|
|
755
|
+
"idempotency": "local-at-most-once",
|
|
756
|
+
"dedupeWindowMs": 86400000,
|
|
757
|
+
"input": {
|
|
758
|
+
"properties": {
|
|
759
|
+
"target_type": {
|
|
760
|
+
"type": "string",
|
|
761
|
+
"description": "Exact owned-content edit contract",
|
|
762
|
+
"enum": [
|
|
763
|
+
"note",
|
|
764
|
+
"comment",
|
|
765
|
+
"draft",
|
|
766
|
+
"article"
|
|
767
|
+
]
|
|
768
|
+
},
|
|
769
|
+
"target_id": {
|
|
770
|
+
"type": "number",
|
|
771
|
+
"description": "Exact positive owned entity ID",
|
|
772
|
+
"minimum": 1,
|
|
773
|
+
"maximum": 9007199254740991
|
|
774
|
+
},
|
|
775
|
+
"body": {
|
|
776
|
+
"type": "string",
|
|
777
|
+
"description": "Exact replacement body",
|
|
778
|
+
"minLength": 1,
|
|
779
|
+
"maxLength": 50000
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
"required": [
|
|
783
|
+
"target_type",
|
|
784
|
+
"target_id",
|
|
785
|
+
"body"
|
|
786
|
+
]
|
|
787
|
+
},
|
|
788
|
+
"webSession": {
|
|
789
|
+
"site": "substack",
|
|
790
|
+
"action": "content.edit",
|
|
791
|
+
"contractVersion": 1,
|
|
792
|
+
"timeoutMs": 60000,
|
|
793
|
+
"maxOutputBytes": 4194304
|
|
794
|
+
}
|
|
795
|
+
},
|
|
796
|
+
"articles.publish": {
|
|
797
|
+
"description": "Capture-required contract reservation: publish one article only against an exact viewer-owned publication origin, with send-email permanently opt-in and never enabled by default.",
|
|
798
|
+
"risk": "R3",
|
|
799
|
+
"sideEffect": "Publishes one externally visible article on the exact confirmed viewer-owned publication; no subscriber email is sent by default.",
|
|
800
|
+
"idempotency": "local-at-most-once",
|
|
801
|
+
"dedupeWindowMs": 86400000,
|
|
802
|
+
"input": {
|
|
803
|
+
"properties": {
|
|
804
|
+
"publication_id": {
|
|
805
|
+
"type": "number",
|
|
806
|
+
"description": "Exact viewer-owned publication ID resolved to its bound origin",
|
|
807
|
+
"minimum": 1,
|
|
808
|
+
"maximum": 9007199254740991
|
|
809
|
+
},
|
|
810
|
+
"title": {
|
|
811
|
+
"type": "string",
|
|
812
|
+
"description": "Exact article title",
|
|
813
|
+
"minLength": 1,
|
|
814
|
+
"maxLength": 160
|
|
815
|
+
},
|
|
816
|
+
"body": {
|
|
817
|
+
"type": "string",
|
|
818
|
+
"description": "Exact article body",
|
|
819
|
+
"minLength": 1,
|
|
820
|
+
"maxLength": 50000
|
|
821
|
+
},
|
|
822
|
+
"media": {
|
|
823
|
+
"type": "file",
|
|
824
|
+
"description": "Optional reviewed lead image, video, or audio attachment",
|
|
825
|
+
"maxBytes": 536870912,
|
|
826
|
+
"mediaTypes": [
|
|
827
|
+
"image/jpeg",
|
|
828
|
+
"image/png",
|
|
829
|
+
"image/gif",
|
|
830
|
+
"image/webp",
|
|
831
|
+
"video/mp4",
|
|
832
|
+
"video/quicktime",
|
|
833
|
+
"audio/mpeg",
|
|
834
|
+
"audio/mp4",
|
|
835
|
+
"audio/wav"
|
|
836
|
+
]
|
|
837
|
+
}
|
|
838
|
+
},
|
|
839
|
+
"required": [
|
|
840
|
+
"publication_id",
|
|
841
|
+
"title",
|
|
842
|
+
"body"
|
|
843
|
+
]
|
|
844
|
+
},
|
|
845
|
+
"webSession": {
|
|
846
|
+
"site": "substack",
|
|
847
|
+
"action": "articles.publish",
|
|
848
|
+
"contractVersion": 1,
|
|
849
|
+
"timeoutMs": 600000,
|
|
850
|
+
"maxOutputBytes": 4194304
|
|
851
|
+
}
|
|
852
|
+
},
|
|
853
|
+
"content.schedule": {
|
|
854
|
+
"description": "Capture-required contract reservation: schedule one exact article on a viewer-owned publication with send-email disabled unless a future separate explicit contract is reviewed.",
|
|
855
|
+
"risk": "R3",
|
|
856
|
+
"sideEffect": "Schedules one externally visible article on the exact confirmed viewer-owned publication; no subscriber email is sent by default.",
|
|
857
|
+
"idempotency": "local-at-most-once",
|
|
858
|
+
"dedupeWindowMs": 86400000,
|
|
859
|
+
"input": {
|
|
860
|
+
"properties": {
|
|
861
|
+
"publication_id": {
|
|
862
|
+
"type": "number",
|
|
863
|
+
"description": "Exact viewer-owned publication ID resolved to its bound origin",
|
|
864
|
+
"minimum": 1,
|
|
865
|
+
"maximum": 9007199254740991
|
|
866
|
+
},
|
|
867
|
+
"title": {
|
|
868
|
+
"type": "string",
|
|
869
|
+
"description": "Exact article title",
|
|
870
|
+
"minLength": 1,
|
|
871
|
+
"maxLength": 160
|
|
872
|
+
},
|
|
873
|
+
"body": {
|
|
874
|
+
"type": "string",
|
|
875
|
+
"description": "Exact article body",
|
|
876
|
+
"minLength": 1,
|
|
877
|
+
"maxLength": 50000
|
|
878
|
+
},
|
|
879
|
+
"scheduled_at": {
|
|
880
|
+
"type": "string",
|
|
881
|
+
"description": "Exact ISO-8601 schedule time with explicit offset",
|
|
882
|
+
"minLength": 20,
|
|
883
|
+
"maxLength": 64
|
|
884
|
+
}
|
|
885
|
+
},
|
|
886
|
+
"required": [
|
|
887
|
+
"publication_id",
|
|
888
|
+
"title",
|
|
889
|
+
"body",
|
|
890
|
+
"scheduled_at"
|
|
891
|
+
]
|
|
892
|
+
},
|
|
893
|
+
"webSession": {
|
|
894
|
+
"site": "substack",
|
|
895
|
+
"action": "content.schedule",
|
|
896
|
+
"contractVersion": 1,
|
|
897
|
+
"timeoutMs": 600000,
|
|
898
|
+
"maxOutputBytes": 4194304
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|