@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
package/dist/index.js
ADDED
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
PROVIDER_PLUGIN_ID_MAX_LENGTH,
|
|
4
|
+
PROVIDER_PLUGIN_OPERATION_NAME_MAX_LENGTH,
|
|
5
|
+
isPortableProviderPluginVersion,
|
|
6
|
+
isProviderPluginId,
|
|
7
|
+
isProviderPluginOperationName,
|
|
8
|
+
isProviderPluginSurfaceId
|
|
9
|
+
} from "./index-26yq8q16.js";
|
|
10
|
+
import {
|
|
11
|
+
GHOSTGET_MESSAGING_CLIENT_INTENT_BINDING_V1_CONTRACT_ID,
|
|
12
|
+
GHOSTGET_MESSAGING_CLIENT_INTENT_BINDING_V1_FORMAT,
|
|
13
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_DESCRIPTOR,
|
|
14
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_HASH,
|
|
15
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_ID,
|
|
16
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_FORMAT,
|
|
17
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_DESCRIPTOR,
|
|
18
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_HASH,
|
|
19
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_ID,
|
|
20
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_FORMAT,
|
|
21
|
+
GHOSTGET_MESSAGING_CONTEXT_INSTANCE_V1_CONTRACT_ID,
|
|
22
|
+
GHOSTGET_MESSAGING_CONTEXT_INSTANCE_V2_CONTRACT_ID,
|
|
23
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_DESCRIPTOR,
|
|
24
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_HASH,
|
|
25
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_ID,
|
|
26
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_FORMAT,
|
|
27
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_DESCRIPTOR,
|
|
28
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_HASH,
|
|
29
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_ID,
|
|
30
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_FORMAT,
|
|
31
|
+
MESSAGE_LIKE_ME_SOURCE_CONVERSATION_COORDINATE_V1_CONTRACT_ID,
|
|
32
|
+
MESSAGE_LIKE_ME_SOURCE_CONVERSATION_COORDINATE_V1_SCHEMA_VERSION,
|
|
33
|
+
createBeeperMessageLikeMeContextBindingV1,
|
|
34
|
+
createBeeperMessageLikeMeContextBindingV2,
|
|
35
|
+
createGhostgetMessagingReceiptBindingV1,
|
|
36
|
+
createGhostgetMessagingReceiptBindingV2,
|
|
37
|
+
ghostgetMessagingContextBindingSha256V1,
|
|
38
|
+
ghostgetMessagingContextBindingSha256V2,
|
|
39
|
+
messageLikeMeSourceConversationCoordinateBindingV1,
|
|
40
|
+
parseGhostgetMessagingClientIntentBindingV1,
|
|
41
|
+
parseGhostgetMessagingContextBindingV1,
|
|
42
|
+
parseGhostgetMessagingContextBindingV2,
|
|
43
|
+
parseMessageLikeMeSourceConversationCoordinateV1
|
|
44
|
+
} from "./index-9t13b4k7.js";
|
|
45
|
+
import {
|
|
46
|
+
canonicalJson
|
|
47
|
+
} from "./index-gwk7rbyj.js";
|
|
48
|
+
|
|
49
|
+
// src/local-cli-tool-identity.ts
|
|
50
|
+
import { types as nodeTypes } from "util";
|
|
51
|
+
var strictSemverPattern = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*|[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;
|
|
52
|
+
var sha256Pattern = /^[a-f0-9]{64}$/u;
|
|
53
|
+
var releaseCommitPattern = /^[a-f0-9]{40}$/u;
|
|
54
|
+
var tokenPattern = /^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/u;
|
|
55
|
+
var implementationPattern = /^[A-Za-z0-9](?:[A-Za-z0-9._/+:-]{0,254}[A-Za-z0-9])?$/u;
|
|
56
|
+
function hasWellFormedUnicode(value) {
|
|
57
|
+
for (let index = 0;index < value.length; index += 1) {
|
|
58
|
+
const code = value.charCodeAt(index);
|
|
59
|
+
if (code >= 55296 && code <= 56319) {
|
|
60
|
+
if (index + 1 >= value.length)
|
|
61
|
+
return false;
|
|
62
|
+
const next = value.charCodeAt(index + 1);
|
|
63
|
+
if (next < 56320 || next > 57343)
|
|
64
|
+
return false;
|
|
65
|
+
index += 1;
|
|
66
|
+
} else if (code >= 56320 && code <= 57343) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
function record(value, label) {
|
|
73
|
+
if (typeof value !== "object" || value === null || Array.isArray(value) || nodeTypes.isProxy(value)) {
|
|
74
|
+
throw new Error(`${label} must be an object`);
|
|
75
|
+
}
|
|
76
|
+
const prototype = Object.getPrototypeOf(value);
|
|
77
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
78
|
+
throw new Error(`${label} has an unsupported prototype`);
|
|
79
|
+
}
|
|
80
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
81
|
+
if (Reflect.ownKeys(descriptors).some((key) => typeof key !== "string")) {
|
|
82
|
+
throw new Error(`${label} has unsupported symbol fields`);
|
|
83
|
+
}
|
|
84
|
+
const result = {};
|
|
85
|
+
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
86
|
+
if (!descriptor.enumerable || !("value" in descriptor) || !hasWellFormedUnicode(key) || /[\u0000-\u001f\u007f-\u009f]/u.test(key)) {
|
|
87
|
+
throw new Error(`${label} has unsupported accessor fields`);
|
|
88
|
+
}
|
|
89
|
+
result[key] = descriptor.value;
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function denseArray(value, label, maximum) {
|
|
94
|
+
if (!Array.isArray(value) || nodeTypes.isProxy(value) || Object.getPrototypeOf(value) !== Array.prototype || value.length < 1 || value.length > maximum) {
|
|
95
|
+
throw new Error(`${label} is malformed`);
|
|
96
|
+
}
|
|
97
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
98
|
+
if (Reflect.ownKeys(descriptors).some((key) => typeof key !== "string") || Object.keys(descriptors).length !== value.length + 1) {
|
|
99
|
+
throw new Error(`${label} is malformed`);
|
|
100
|
+
}
|
|
101
|
+
return Object.freeze(Array.from({ length: value.length }, (_unused, index) => {
|
|
102
|
+
const descriptor = descriptors[String(index)];
|
|
103
|
+
if (descriptor === undefined || !descriptor.enumerable || !("value" in descriptor)) {
|
|
104
|
+
throw new Error(`${label} is malformed`);
|
|
105
|
+
}
|
|
106
|
+
return descriptor.value;
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
function exactKeys(value, allowed, label) {
|
|
110
|
+
const allowedKeys = new Set(allowed);
|
|
111
|
+
const unexpected = Object.keys(value).filter((key) => !allowedKeys.has(key));
|
|
112
|
+
if (unexpected.length > 0) {
|
|
113
|
+
throw new Error(`${label} contains unsupported keys: ${unexpected.join(", ")}`);
|
|
114
|
+
}
|
|
115
|
+
for (const key of allowed) {
|
|
116
|
+
if (!Object.hasOwn(value, key) && key !== "sourceUrl" && key !== "releaseCommit" && key !== "releaseManifestSha256" && key !== "releaseManifestUrl" && key !== "archiveSha256" && key !== "downloadUrl") {
|
|
117
|
+
throw new Error(`${label}.${key} is required`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function exactHttpsUrl(value, label) {
|
|
122
|
+
if (typeof value !== "string" || value.length > 2000) {
|
|
123
|
+
throw new Error(`${label} must be a bounded exact HTTPS URL`);
|
|
124
|
+
}
|
|
125
|
+
let parsed;
|
|
126
|
+
try {
|
|
127
|
+
parsed = new URL(value);
|
|
128
|
+
} catch {
|
|
129
|
+
throw new Error(`${label} must be a bounded exact HTTPS URL`);
|
|
130
|
+
}
|
|
131
|
+
if (parsed.protocol !== "https:" || parsed.username !== "" || parsed.password !== "" || parsed.hash !== "" || parsed.search !== "" || parsed.href !== value) {
|
|
132
|
+
throw new Error(`${label} must be a credential-free exact HTTPS URL without a query or fragment`);
|
|
133
|
+
}
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
function optionalDigest(value, label) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return;
|
|
139
|
+
if (typeof value !== "string" || !sha256Pattern.test(value)) {
|
|
140
|
+
throw new Error(`${label} must be one lowercase SHA-256 digest`);
|
|
141
|
+
}
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
144
|
+
function optionalUrl(value, label) {
|
|
145
|
+
return value === undefined ? undefined : exactHttpsUrl(value, label);
|
|
146
|
+
}
|
|
147
|
+
function parseLocalCliToolIdentityV1(value) {
|
|
148
|
+
const tool = record(value, "local CLI tool identity");
|
|
149
|
+
exactKeys(tool, [
|
|
150
|
+
"schemaVersion",
|
|
151
|
+
"id",
|
|
152
|
+
"implementation",
|
|
153
|
+
"versionScheme",
|
|
154
|
+
"version",
|
|
155
|
+
"releaseCommit",
|
|
156
|
+
"releaseManifestSha256",
|
|
157
|
+
"releaseManifestUrl",
|
|
158
|
+
"sourceUrl",
|
|
159
|
+
"artifacts"
|
|
160
|
+
], "local CLI tool identity");
|
|
161
|
+
if (tool.schemaVersion !== 1) {
|
|
162
|
+
throw new Error("local CLI tool identity schemaVersion must be 1");
|
|
163
|
+
}
|
|
164
|
+
if (typeof tool.id !== "string" || !tokenPattern.test(tool.id)) {
|
|
165
|
+
throw new Error("local CLI tool identity id is malformed");
|
|
166
|
+
}
|
|
167
|
+
if (typeof tool.implementation !== "string" || !implementationPattern.test(tool.implementation)) {
|
|
168
|
+
throw new Error("local CLI tool identity implementation is malformed");
|
|
169
|
+
}
|
|
170
|
+
if (tool.versionScheme !== "semver" && tool.versionScheme !== "opaque") {
|
|
171
|
+
throw new Error("local CLI tool identity versionScheme must be semver or opaque");
|
|
172
|
+
}
|
|
173
|
+
if (typeof tool.version !== "string" || tool.version.length < 1 || tool.version.length > 128 || /[\u0000-\u001f\u007f-\u009f]/u.test(tool.version) || !hasWellFormedUnicode(tool.version) || tool.versionScheme === "semver" && !strictSemverPattern.test(tool.version)) {
|
|
174
|
+
throw new Error("local CLI tool identity version is malformed");
|
|
175
|
+
}
|
|
176
|
+
const hasReleaseCommit = tool.releaseCommit !== undefined;
|
|
177
|
+
if (hasReleaseCommit && (typeof tool.releaseCommit !== "string" || !releaseCommitPattern.test(tool.releaseCommit))) {
|
|
178
|
+
throw new Error("local CLI tool identity releaseCommit must be one lowercase 40-character commit ID");
|
|
179
|
+
}
|
|
180
|
+
const releaseManifestSha256 = optionalDigest(tool.releaseManifestSha256, "local CLI tool identity releaseManifestSha256");
|
|
181
|
+
const sourceUrl = optionalUrl(tool.sourceUrl, "local CLI tool identity sourceUrl");
|
|
182
|
+
const releaseManifestUrl = optionalUrl(tool.releaseManifestUrl, "local CLI tool identity releaseManifestUrl");
|
|
183
|
+
if (releaseManifestSha256 === undefined !== (releaseManifestUrl === undefined)) {
|
|
184
|
+
throw new Error("local CLI tool identity release manifest URL and digest must be declared together");
|
|
185
|
+
}
|
|
186
|
+
const rawArtifacts = denseArray(tool.artifacts, "local CLI tool identity artifacts", 16);
|
|
187
|
+
const artifacts = rawArtifacts.map((rawArtifact, index) => {
|
|
188
|
+
const artifact = record(rawArtifact, `local CLI tool artifact ${index}`);
|
|
189
|
+
exactKeys(artifact, [
|
|
190
|
+
"platform",
|
|
191
|
+
"arch",
|
|
192
|
+
"executableSha256",
|
|
193
|
+
"archiveSha256",
|
|
194
|
+
"downloadUrl"
|
|
195
|
+
], `local CLI tool artifact ${index}`);
|
|
196
|
+
if (typeof artifact.platform !== "string" || !tokenPattern.test(artifact.platform)) {
|
|
197
|
+
throw new Error(`local CLI tool artifact ${index}.platform is malformed`);
|
|
198
|
+
}
|
|
199
|
+
if (typeof artifact.arch !== "string" || !tokenPattern.test(artifact.arch)) {
|
|
200
|
+
throw new Error(`local CLI tool artifact ${index}.arch is malformed`);
|
|
201
|
+
}
|
|
202
|
+
if (typeof artifact.executableSha256 !== "string" || !sha256Pattern.test(artifact.executableSha256)) {
|
|
203
|
+
throw new Error(`local CLI tool artifact ${index}.executableSha256 must be one lowercase SHA-256 digest`);
|
|
204
|
+
}
|
|
205
|
+
const archiveSha256 = optionalDigest(artifact.archiveSha256, `local CLI tool artifact ${index}.archiveSha256`);
|
|
206
|
+
const downloadUrl = optionalUrl(artifact.downloadUrl, `local CLI tool artifact ${index}.downloadUrl`);
|
|
207
|
+
if (archiveSha256 === undefined !== (downloadUrl === undefined)) {
|
|
208
|
+
throw new Error(`local CLI tool artifact ${index} archive URL and digest must be declared together`);
|
|
209
|
+
}
|
|
210
|
+
return Object.freeze({
|
|
211
|
+
platform: artifact.platform,
|
|
212
|
+
arch: artifact.arch,
|
|
213
|
+
executableSha256: artifact.executableSha256,
|
|
214
|
+
...archiveSha256 === undefined ? {} : { archiveSha256 },
|
|
215
|
+
...downloadUrl === undefined ? {} : { downloadUrl }
|
|
216
|
+
});
|
|
217
|
+
}).sort((left, right) => {
|
|
218
|
+
const leftCoordinate = `${left.platform}\x00${left.arch}`;
|
|
219
|
+
const rightCoordinate = `${right.platform}\x00${right.arch}`;
|
|
220
|
+
return leftCoordinate < rightCoordinate ? -1 : leftCoordinate > rightCoordinate ? 1 : 0;
|
|
221
|
+
});
|
|
222
|
+
const coordinates = artifacts.map((artifact) => `${artifact.platform}/${artifact.arch}`);
|
|
223
|
+
if (new Set(coordinates).size !== coordinates.length) {
|
|
224
|
+
throw new Error("local CLI tool identity repeats a platform/architecture artifact");
|
|
225
|
+
}
|
|
226
|
+
return Object.freeze({
|
|
227
|
+
schemaVersion: 1,
|
|
228
|
+
id: tool.id,
|
|
229
|
+
implementation: tool.implementation,
|
|
230
|
+
versionScheme: tool.versionScheme,
|
|
231
|
+
version: tool.version,
|
|
232
|
+
...hasReleaseCommit ? { releaseCommit: tool.releaseCommit } : {},
|
|
233
|
+
...releaseManifestSha256 === undefined ? {} : { releaseManifestSha256, releaseManifestUrl },
|
|
234
|
+
...sourceUrl === undefined ? {} : { sourceUrl },
|
|
235
|
+
artifacts: Object.freeze(artifacts)
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function localCliToolArtifactForCurrentRuntime(tool) {
|
|
239
|
+
const artifact = tool.artifacts.find((candidate) => candidate.platform === process.platform && candidate.arch === process.arch);
|
|
240
|
+
if (artifact === undefined) {
|
|
241
|
+
throw new Error(`local CLI tool ${tool.id}@${tool.version} does not support ${process.platform}/${process.arch}`);
|
|
242
|
+
}
|
|
243
|
+
return artifact;
|
|
244
|
+
}
|
|
245
|
+
// src/provider-plugin-cleanup-execution.ts
|
|
246
|
+
function startProviderPluginCleanupTrackedOperation(register, start) {
|
|
247
|
+
if (register === undefined) {
|
|
248
|
+
return start(undefined, Object.freeze({
|
|
249
|
+
verified: () => {
|
|
250
|
+
return;
|
|
251
|
+
},
|
|
252
|
+
unsafe: () => {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
let resolveCleanup;
|
|
258
|
+
let rejectCleanup;
|
|
259
|
+
let settled = false;
|
|
260
|
+
const cleanupBarrier = new Promise((resolve, reject) => {
|
|
261
|
+
resolveCleanup = resolve;
|
|
262
|
+
rejectCleanup = reject;
|
|
263
|
+
});
|
|
264
|
+
cleanupBarrier.catch(() => {
|
|
265
|
+
return;
|
|
266
|
+
});
|
|
267
|
+
const publishCleanupResource = register(cleanupBarrier);
|
|
268
|
+
const cleanup = Object.freeze({
|
|
269
|
+
verified: () => {
|
|
270
|
+
if (settled)
|
|
271
|
+
return;
|
|
272
|
+
settled = true;
|
|
273
|
+
resolveCleanup?.();
|
|
274
|
+
},
|
|
275
|
+
unsafe: (reason) => {
|
|
276
|
+
if (settled)
|
|
277
|
+
return;
|
|
278
|
+
settled = true;
|
|
279
|
+
rejectCleanup?.(reason instanceof Error ? reason : new Error("provider cleanup could not be verified"));
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
try {
|
|
283
|
+
return Promise.resolve(start(typeof publishCleanupResource === "function" ? publishCleanupResource : undefined, cleanup)).catch((error) => {
|
|
284
|
+
cleanup.unsafe(error);
|
|
285
|
+
throw error;
|
|
286
|
+
});
|
|
287
|
+
} catch (error) {
|
|
288
|
+
cleanup.unsafe(error);
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// src/article-draft-document.ts
|
|
293
|
+
var ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION = 1;
|
|
294
|
+
var ARTICLE_DRAFT_DOCUMENT_IMAGE_SCHEMA_VERSION = 2;
|
|
295
|
+
var MAX_ARTICLE_DRAFT_DOCUMENT_BYTES = 512 * 1024;
|
|
296
|
+
var MAX_ARTICLE_DRAFT_BLOCKS = 5000;
|
|
297
|
+
var MAX_ARTICLE_DRAFT_CHARACTERS = 125000;
|
|
298
|
+
var articleDraftStyleOrder = Object.freeze({
|
|
299
|
+
bold: 0,
|
|
300
|
+
italic: 1,
|
|
301
|
+
strikethrough: 2
|
|
302
|
+
});
|
|
303
|
+
var textBlockTypes = new Set([
|
|
304
|
+
"paragraph",
|
|
305
|
+
"heading1",
|
|
306
|
+
"heading2",
|
|
307
|
+
"blockquote",
|
|
308
|
+
"unordered-list-item",
|
|
309
|
+
"ordered-list-item"
|
|
310
|
+
]);
|
|
311
|
+
function isRecord(value) {
|
|
312
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
313
|
+
}
|
|
314
|
+
function record2(value, label) {
|
|
315
|
+
if (!isRecord(value))
|
|
316
|
+
throw new Error(`${label} must be an object`);
|
|
317
|
+
return value;
|
|
318
|
+
}
|
|
319
|
+
function exactKeys2(value, keys, label) {
|
|
320
|
+
const actual = Object.keys(value).sort().join(",");
|
|
321
|
+
const expected = [...keys].sort().join(",");
|
|
322
|
+
if (actual !== expected)
|
|
323
|
+
throw new Error(`${label} must contain exactly ${expected || "no fields"}`);
|
|
324
|
+
}
|
|
325
|
+
function boundedHttpsUrl(value, label) {
|
|
326
|
+
if (typeof value !== "string" || value.length < 1 || value.length > 8192 || /[\0\r\n]/u.test(value)) {
|
|
327
|
+
throw new Error(`${label} must be a bounded absolute HTTPS URL`);
|
|
328
|
+
}
|
|
329
|
+
let parsed;
|
|
330
|
+
try {
|
|
331
|
+
parsed = new URL(value);
|
|
332
|
+
} catch {
|
|
333
|
+
throw new Error(`${label} must be a bounded absolute HTTPS URL`);
|
|
334
|
+
}
|
|
335
|
+
if (parsed.protocol !== "https:" || parsed.username !== "" || parsed.password !== "" || parsed.href !== value)
|
|
336
|
+
throw new Error(`${label} must be one canonical absolute HTTPS URL`);
|
|
337
|
+
return parsed.href;
|
|
338
|
+
}
|
|
339
|
+
function validUtf16Boundary(text, offset) {
|
|
340
|
+
if (offset <= 0 || offset >= text.length)
|
|
341
|
+
return true;
|
|
342
|
+
const previous = text.charCodeAt(offset - 1);
|
|
343
|
+
const next = text.charCodeAt(offset);
|
|
344
|
+
return !(previous >= 55296 && previous <= 56319 && next >= 56320 && next <= 57343);
|
|
345
|
+
}
|
|
346
|
+
function boundedRange(value, text, label) {
|
|
347
|
+
const offset = value.offset;
|
|
348
|
+
const length = value.length;
|
|
349
|
+
if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(length) || offset < 0 || length < 1 || offset + length > text.length || !validUtf16Boundary(text, offset) || !validUtf16Boundary(text, offset + length))
|
|
350
|
+
throw new Error(`${label} must stay on UTF-16 boundaries inside its text`);
|
|
351
|
+
return Object.freeze({ offset, length });
|
|
352
|
+
}
|
|
353
|
+
function checkedLimits(value) {
|
|
354
|
+
if (!Number.isSafeInteger(value.maximumBlocks) || value.maximumBlocks < 1 || value.maximumBlocks > MAX_ARTICLE_DRAFT_BLOCKS || !Number.isSafeInteger(value.maximumCharacters) || value.maximumCharacters < 1 || value.maximumCharacters > MAX_ARTICLE_DRAFT_CHARACTERS)
|
|
355
|
+
throw new Error("Article draft document limits are invalid");
|
|
356
|
+
return value;
|
|
357
|
+
}
|
|
358
|
+
function compareStyleRanges(left, right) {
|
|
359
|
+
return left.offset - right.offset || left.length - right.length || articleDraftStyleOrder[left.style] - articleDraftStyleOrder[right.style];
|
|
360
|
+
}
|
|
361
|
+
function parseArticleDraftDocument(value, limitsValue) {
|
|
362
|
+
const limits = checkedLimits(limitsValue);
|
|
363
|
+
if (typeof value !== "string" || value.length < 1 || Buffer.byteLength(value, "utf8") > MAX_ARTICLE_DRAFT_DOCUMENT_BYTES || value.includes("\x00"))
|
|
364
|
+
throw new Error("input.document must be bounded canonical ArticleDraftDocument JSON");
|
|
365
|
+
let parsed;
|
|
366
|
+
try {
|
|
367
|
+
parsed = JSON.parse(value);
|
|
368
|
+
} catch {
|
|
369
|
+
throw new Error("input.document must be valid ArticleDraftDocument JSON");
|
|
370
|
+
}
|
|
371
|
+
if (canonicalJson(parsed) !== value) {
|
|
372
|
+
throw new Error("input.document must use canonical JSON encoding");
|
|
373
|
+
}
|
|
374
|
+
const root = record2(parsed, "input.document");
|
|
375
|
+
exactKeys2(root, ["schemaVersion", "blocks"], "input.document");
|
|
376
|
+
if (root.schemaVersion !== ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION || !Array.isArray(root.blocks)) {
|
|
377
|
+
throw new Error(`input.document must use ArticleDraftDocument schemaVersion ${ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION}`);
|
|
378
|
+
}
|
|
379
|
+
if (root.blocks.length < 1 || root.blocks.length > limits.maximumBlocks) {
|
|
380
|
+
throw new Error(`input.document must contain 1-${limits.maximumBlocks} blocks`);
|
|
381
|
+
}
|
|
382
|
+
const blocks = [];
|
|
383
|
+
let totalCharacters = 0;
|
|
384
|
+
for (const [index, rawBlock] of root.blocks.entries()) {
|
|
385
|
+
const label = `input.document.blocks[${index}]`;
|
|
386
|
+
const block = record2(rawBlock, label);
|
|
387
|
+
const allowed = [
|
|
388
|
+
"type",
|
|
389
|
+
"text",
|
|
390
|
+
...block.links === undefined ? [] : ["links"],
|
|
391
|
+
...block.styles === undefined ? [] : ["styles"]
|
|
392
|
+
];
|
|
393
|
+
exactKeys2(block, allowed, label);
|
|
394
|
+
if (typeof block.type !== "string" || !textBlockTypes.has(block.type)) {
|
|
395
|
+
throw new Error(`${label}.type is outside ArticleDraftDocument schemaVersion 1`);
|
|
396
|
+
}
|
|
397
|
+
if (typeof block.text !== "string" || /[\0\r\n]/u.test(block.text)) {
|
|
398
|
+
throw new Error(`${label}.text must be one bounded line`);
|
|
399
|
+
}
|
|
400
|
+
totalCharacters += block.text.length;
|
|
401
|
+
if (totalCharacters > limits.maximumCharacters) {
|
|
402
|
+
throw new Error(`input.document text must contain at most ${limits.maximumCharacters} UTF-16 code units`);
|
|
403
|
+
}
|
|
404
|
+
const rawLinks = block.links ?? [];
|
|
405
|
+
const rawStyles = block.styles ?? [];
|
|
406
|
+
if (!Array.isArray(rawLinks) || rawLinks.length > 500 || !Array.isArray(rawStyles) || rawStyles.length > 500)
|
|
407
|
+
throw new Error(`${label} ranges exceeded their bounds`);
|
|
408
|
+
const links = rawLinks.map((rawLink, rangeIndex) => {
|
|
409
|
+
const rangeLabel = `${label}.links[${rangeIndex}]`;
|
|
410
|
+
const link = record2(rawLink, rangeLabel);
|
|
411
|
+
exactKeys2(link, ["offset", "length", "url"], rangeLabel);
|
|
412
|
+
const range = boundedRange(link, block.text, rangeLabel);
|
|
413
|
+
return Object.freeze({ ...range, url: boundedHttpsUrl(link.url, `${rangeLabel}.url`) });
|
|
414
|
+
});
|
|
415
|
+
let linkEnd = 0;
|
|
416
|
+
for (const link of links) {
|
|
417
|
+
if (link.offset < linkEnd)
|
|
418
|
+
throw new Error(`${label}.links must be ordered and non-overlapping`);
|
|
419
|
+
linkEnd = link.offset + link.length;
|
|
420
|
+
}
|
|
421
|
+
const styles = rawStyles.map((rawStyle, rangeIndex) => {
|
|
422
|
+
const rangeLabel = `${label}.styles[${rangeIndex}]`;
|
|
423
|
+
const style = record2(rawStyle, rangeLabel);
|
|
424
|
+
exactKeys2(style, ["offset", "length", "style"], rangeLabel);
|
|
425
|
+
const range = boundedRange(style, block.text, rangeLabel);
|
|
426
|
+
if (style.style !== "bold" && style.style !== "italic" && style.style !== "strikethrough") {
|
|
427
|
+
throw new Error(`${rangeLabel}.style is outside ArticleDraftDocument schemaVersion 1`);
|
|
428
|
+
}
|
|
429
|
+
return Object.freeze({ ...range, style: style.style });
|
|
430
|
+
});
|
|
431
|
+
for (let rangeIndex = 1;rangeIndex < styles.length; rangeIndex += 1) {
|
|
432
|
+
const previous = styles[rangeIndex - 1];
|
|
433
|
+
const current = styles[rangeIndex];
|
|
434
|
+
if (compareStyleRanges(previous, current) > 0) {
|
|
435
|
+
throw new Error(`${label}.styles must be ordered by offset, then length, then style`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const styleEnds = {};
|
|
439
|
+
for (const style of styles) {
|
|
440
|
+
const previousEnd = styleEnds[style.style];
|
|
441
|
+
if (previousEnd !== undefined && style.offset < previousEnd) {
|
|
442
|
+
throw new Error(`${label}.styles must not contain duplicate or overlapping same-style ranges`);
|
|
443
|
+
}
|
|
444
|
+
styleEnds[style.style] = style.offset + style.length;
|
|
445
|
+
}
|
|
446
|
+
blocks.push(Object.freeze({
|
|
447
|
+
type: block.type,
|
|
448
|
+
text: block.text,
|
|
449
|
+
links: Object.freeze(links),
|
|
450
|
+
styles: Object.freeze(styles)
|
|
451
|
+
}));
|
|
452
|
+
}
|
|
453
|
+
if (totalCharacters < 1)
|
|
454
|
+
throw new Error("input.document must contain article text");
|
|
455
|
+
return Object.freeze({
|
|
456
|
+
schemaVersion: ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION,
|
|
457
|
+
blocks: Object.freeze(blocks)
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
function articleDraftDocumentIssues(value, limits) {
|
|
461
|
+
try {
|
|
462
|
+
parseArticleDraftDocument(value, limits);
|
|
463
|
+
return Object.freeze([]);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
return Object.freeze([
|
|
466
|
+
error instanceof Error ? error.message : "input.document is invalid"
|
|
467
|
+
]);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
function checkedImageLimits(value) {
|
|
471
|
+
const text = checkedLimits(value);
|
|
472
|
+
if (!Number.isSafeInteger(value.maximumImages) || value.maximumImages < 1 || value.maximumImages > 100)
|
|
473
|
+
throw new Error("Article draft image limits are invalid");
|
|
474
|
+
return Object.freeze({ ...text, maximumImages: value.maximumImages });
|
|
475
|
+
}
|
|
476
|
+
function optionalImageText(value, label, maximum) {
|
|
477
|
+
if (value === undefined)
|
|
478
|
+
return;
|
|
479
|
+
if (typeof value !== "string" || value.length < 1 || value.length > maximum || /[\0\r]/u.test(value))
|
|
480
|
+
throw new Error(`${label} must be bounded text`);
|
|
481
|
+
return value;
|
|
482
|
+
}
|
|
483
|
+
function parseArticleDraftDocumentV2(value, limitsValue) {
|
|
484
|
+
const limits = checkedImageLimits(limitsValue);
|
|
485
|
+
if (typeof value !== "string" || value.length < 1 || Buffer.byteLength(value, "utf8") > MAX_ARTICLE_DRAFT_DOCUMENT_BYTES || value.includes("\x00"))
|
|
486
|
+
throw new Error("input.document must be bounded canonical ArticleDraftDocument JSON");
|
|
487
|
+
let parsed;
|
|
488
|
+
try {
|
|
489
|
+
parsed = JSON.parse(value);
|
|
490
|
+
} catch {
|
|
491
|
+
throw new Error("input.document must be valid ArticleDraftDocument JSON");
|
|
492
|
+
}
|
|
493
|
+
if (canonicalJson(parsed) !== value) {
|
|
494
|
+
throw new Error("input.document must use canonical JSON encoding");
|
|
495
|
+
}
|
|
496
|
+
const root = record2(parsed, "input.document");
|
|
497
|
+
exactKeys2(root, ["schemaVersion", "blocks"], "input.document");
|
|
498
|
+
if (root.schemaVersion !== ARTICLE_DRAFT_DOCUMENT_IMAGE_SCHEMA_VERSION || !Array.isArray(root.blocks)) {
|
|
499
|
+
throw new Error(`input.document must use ArticleDraftDocument schemaVersion ${ARTICLE_DRAFT_DOCUMENT_IMAGE_SCHEMA_VERSION}`);
|
|
500
|
+
}
|
|
501
|
+
if (root.blocks.length < 1 || root.blocks.length > limits.maximumBlocks) {
|
|
502
|
+
throw new Error(`input.document must contain 1-${limits.maximumBlocks} blocks`);
|
|
503
|
+
}
|
|
504
|
+
const blocks = [];
|
|
505
|
+
const imageIndexes = new Set;
|
|
506
|
+
let totalCharacters = 0;
|
|
507
|
+
for (const [index, rawBlock] of root.blocks.entries()) {
|
|
508
|
+
const label = `input.document.blocks[${index}]`;
|
|
509
|
+
const block = record2(rawBlock, label);
|
|
510
|
+
if (block.type === "image") {
|
|
511
|
+
exactKeys2(block, [
|
|
512
|
+
"type",
|
|
513
|
+
"imageIndex",
|
|
514
|
+
...block.altText === undefined ? [] : ["altText"],
|
|
515
|
+
...block.caption === undefined ? [] : ["caption"]
|
|
516
|
+
], label);
|
|
517
|
+
if (!Number.isSafeInteger(block.imageIndex) || block.imageIndex < 0 || block.imageIndex >= limits.maximumImages || imageIndexes.has(block.imageIndex))
|
|
518
|
+
throw new Error(`${label}.imageIndex must be a unique bounded zero-based image index`);
|
|
519
|
+
const altText = optionalImageText(block.altText, `${label}.altText`, 1000);
|
|
520
|
+
const caption = optionalImageText(block.caption, `${label}.caption`, 1000);
|
|
521
|
+
imageIndexes.add(block.imageIndex);
|
|
522
|
+
blocks.push(Object.freeze({
|
|
523
|
+
type: "image",
|
|
524
|
+
imageIndex: block.imageIndex,
|
|
525
|
+
...altText === undefined ? {} : { altText },
|
|
526
|
+
...caption === undefined ? {} : { caption }
|
|
527
|
+
}));
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
const parsedText = parseArticleDraftDocument(canonicalJson({
|
|
531
|
+
schemaVersion: ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION,
|
|
532
|
+
blocks: [rawBlock]
|
|
533
|
+
}), {
|
|
534
|
+
maximumBlocks: 1,
|
|
535
|
+
maximumCharacters: limits.maximumCharacters
|
|
536
|
+
}).blocks[0];
|
|
537
|
+
if (parsedText === undefined)
|
|
538
|
+
throw new Error(`${label} was omitted after validation`);
|
|
539
|
+
totalCharacters += parsedText.text.length;
|
|
540
|
+
if (totalCharacters > limits.maximumCharacters) {
|
|
541
|
+
throw new Error(`input.document text must contain at most ${limits.maximumCharacters} UTF-16 code units`);
|
|
542
|
+
}
|
|
543
|
+
blocks.push(parsedText);
|
|
544
|
+
}
|
|
545
|
+
if (totalCharacters < 1)
|
|
546
|
+
throw new Error("input.document must contain article text");
|
|
547
|
+
const orderedIndexes = [...imageIndexes].sort((left, right) => left - right);
|
|
548
|
+
if (orderedIndexes.some((value2, index) => value2 !== index)) {
|
|
549
|
+
throw new Error("input.document imageIndex values must be contiguous from zero");
|
|
550
|
+
}
|
|
551
|
+
return Object.freeze({
|
|
552
|
+
schemaVersion: ARTICLE_DRAFT_DOCUMENT_IMAGE_SCHEMA_VERSION,
|
|
553
|
+
blocks: Object.freeze(blocks)
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
function articleDraftDocumentV2Issues(value, limits) {
|
|
557
|
+
try {
|
|
558
|
+
parseArticleDraftDocumentV2(value, limits);
|
|
559
|
+
return Object.freeze([]);
|
|
560
|
+
} catch (error) {
|
|
561
|
+
return Object.freeze([
|
|
562
|
+
error instanceof Error ? error.message : "input.document is invalid"
|
|
563
|
+
]);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
// src/article-draft-embeds.ts
|
|
567
|
+
var MAX_X_STATUS_ARTICLE_EMBED_CHARACTERS = 25000;
|
|
568
|
+
function isRecord2(value) {
|
|
569
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
570
|
+
}
|
|
571
|
+
function exactEmbed(value) {
|
|
572
|
+
if (!isRecord2(value)) {
|
|
573
|
+
throw new Error("X status Article embed must contain exactly text,url");
|
|
574
|
+
}
|
|
575
|
+
const keys = Reflect.ownKeys(value);
|
|
576
|
+
if (keys.some((key) => typeof key !== "string") || keys.sort().join(",") !== "text,url") {
|
|
577
|
+
throw new Error("X status Article embed must contain exactly text,url");
|
|
578
|
+
}
|
|
579
|
+
const textDescriptor = Object.getOwnPropertyDescriptor(value, "text");
|
|
580
|
+
const urlDescriptor = Object.getOwnPropertyDescriptor(value, "url");
|
|
581
|
+
if (textDescriptor === undefined || urlDescriptor === undefined || !("value" in textDescriptor) || !("value" in urlDescriptor) || !textDescriptor.enumerable || !urlDescriptor.enumerable)
|
|
582
|
+
throw new Error("X status Article embed must contain plain text,url values");
|
|
583
|
+
const text = textDescriptor.value;
|
|
584
|
+
const url = urlDescriptor.value;
|
|
585
|
+
if (typeof text !== "string" || text.length < 1 || text.length > MAX_X_STATUS_ARTICLE_EMBED_CHARACTERS || text.includes("\x00") || text.trim().length < 1) {
|
|
586
|
+
throw new Error(`X status Article embed text must contain 1-${MAX_X_STATUS_ARTICLE_EMBED_CHARACTERS} characters`);
|
|
587
|
+
}
|
|
588
|
+
if (typeof url !== "string" || url.length < 1 || url.length > 8192 || /[\0\r\n]/u.test(url)) {
|
|
589
|
+
throw new Error("X status Article embed URL must be one bounded X status URL");
|
|
590
|
+
}
|
|
591
|
+
return Object.freeze({ text, url });
|
|
592
|
+
}
|
|
593
|
+
function canonicalXStatusUrl(value) {
|
|
594
|
+
let url;
|
|
595
|
+
try {
|
|
596
|
+
url = new URL(value);
|
|
597
|
+
} catch {
|
|
598
|
+
throw new Error("X status Article embed URL must be one bounded X status URL");
|
|
599
|
+
}
|
|
600
|
+
const hosts = new Set(["x.com", "www.x.com", "twitter.com", "www.twitter.com"]);
|
|
601
|
+
const match = /^\/([A-Za-z0-9_]{1,15})\/status\/([0-9]{1,32})\/?$/u.exec(url.pathname);
|
|
602
|
+
if (url.protocol !== "https:" || url.username !== "" || url.password !== "" || url.port !== "" || !hosts.has(url.hostname) || match === null)
|
|
603
|
+
throw new Error("X status Article embed URL must be one bounded X status URL");
|
|
604
|
+
return `https://x.com/${match[1]}/status/${match[2]}`;
|
|
605
|
+
}
|
|
606
|
+
function textBlock(type, text) {
|
|
607
|
+
return Object.freeze({
|
|
608
|
+
type,
|
|
609
|
+
text,
|
|
610
|
+
links: Object.freeze([]),
|
|
611
|
+
styles: Object.freeze([])
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
function projectXStatusArticleEmbed(value, target) {
|
|
615
|
+
const embed = exactEmbed(value);
|
|
616
|
+
if (target !== "x-web" && target !== "linkedin-web") {
|
|
617
|
+
throw new Error("X status Article embed target must be x-web or linkedin-web");
|
|
618
|
+
}
|
|
619
|
+
const canonicalUrl = canonicalXStatusUrl(embed.url);
|
|
620
|
+
const quoteBlocks = embed.text.replaceAll(`\r
|
|
621
|
+
`, `
|
|
622
|
+
`).replaceAll("\r", `
|
|
623
|
+
`).split(`
|
|
624
|
+
`).filter((line) => line.length > 0).map((line) => textBlock("blockquote", line));
|
|
625
|
+
return Object.freeze([
|
|
626
|
+
...quoteBlocks,
|
|
627
|
+
Object.freeze({
|
|
628
|
+
type: "paragraph",
|
|
629
|
+
text: canonicalUrl,
|
|
630
|
+
links: Object.freeze([Object.freeze({
|
|
631
|
+
offset: 0,
|
|
632
|
+
length: canonicalUrl.length,
|
|
633
|
+
url: canonicalUrl
|
|
634
|
+
})]),
|
|
635
|
+
styles: Object.freeze([])
|
|
636
|
+
})
|
|
637
|
+
]);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// src/index.ts
|
|
641
|
+
var PROVIDER_PLUGIN_ID_MAX_LENGTH2 = PROVIDER_PLUGIN_ID_MAX_LENGTH;
|
|
642
|
+
var PROVIDER_PLUGIN_OPERATION_NAME_MAX_LENGTH2 = PROVIDER_PLUGIN_OPERATION_NAME_MAX_LENGTH;
|
|
643
|
+
var isPortableProviderPluginVersion2 = isPortableProviderPluginVersion;
|
|
644
|
+
var isProviderPluginId2 = isProviderPluginId;
|
|
645
|
+
var isProviderPluginOperationName2 = isProviderPluginOperationName;
|
|
646
|
+
var isProviderPluginSurfaceId2 = isProviderPluginSurfaceId;
|
|
647
|
+
export {
|
|
648
|
+
startProviderPluginCleanupTrackedOperation,
|
|
649
|
+
projectXStatusArticleEmbed,
|
|
650
|
+
parseMessageLikeMeSourceConversationCoordinateV1,
|
|
651
|
+
parseLocalCliToolIdentityV1,
|
|
652
|
+
parseGhostgetMessagingContextBindingV2,
|
|
653
|
+
parseGhostgetMessagingContextBindingV1,
|
|
654
|
+
parseGhostgetMessagingClientIntentBindingV1,
|
|
655
|
+
parseArticleDraftDocumentV2,
|
|
656
|
+
parseArticleDraftDocument,
|
|
657
|
+
messageLikeMeSourceConversationCoordinateBindingV1,
|
|
658
|
+
localCliToolArtifactForCurrentRuntime,
|
|
659
|
+
isProviderPluginSurfaceId2 as isProviderPluginSurfaceId,
|
|
660
|
+
isProviderPluginOperationName2 as isProviderPluginOperationName,
|
|
661
|
+
isProviderPluginId2 as isProviderPluginId,
|
|
662
|
+
isPortableProviderPluginVersion2 as isPortableProviderPluginVersion,
|
|
663
|
+
ghostgetMessagingContextBindingSha256V2,
|
|
664
|
+
ghostgetMessagingContextBindingSha256V1,
|
|
665
|
+
createGhostgetMessagingReceiptBindingV2,
|
|
666
|
+
createGhostgetMessagingReceiptBindingV1,
|
|
667
|
+
createBeeperMessageLikeMeContextBindingV2,
|
|
668
|
+
createBeeperMessageLikeMeContextBindingV1,
|
|
669
|
+
articleDraftDocumentV2Issues,
|
|
670
|
+
articleDraftDocumentIssues,
|
|
671
|
+
PROVIDER_PLUGIN_OPERATION_NAME_MAX_LENGTH2 as PROVIDER_PLUGIN_OPERATION_NAME_MAX_LENGTH,
|
|
672
|
+
PROVIDER_PLUGIN_ID_MAX_LENGTH2 as PROVIDER_PLUGIN_ID_MAX_LENGTH,
|
|
673
|
+
MESSAGE_LIKE_ME_SOURCE_CONVERSATION_COORDINATE_V1_SCHEMA_VERSION,
|
|
674
|
+
MESSAGE_LIKE_ME_SOURCE_CONVERSATION_COORDINATE_V1_CONTRACT_ID,
|
|
675
|
+
MAX_X_STATUS_ARTICLE_EMBED_CHARACTERS,
|
|
676
|
+
MAX_ARTICLE_DRAFT_DOCUMENT_BYTES,
|
|
677
|
+
MAX_ARTICLE_DRAFT_CHARACTERS,
|
|
678
|
+
MAX_ARTICLE_DRAFT_BLOCKS,
|
|
679
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_FORMAT,
|
|
680
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_ID,
|
|
681
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_HASH,
|
|
682
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V2_CONTRACT_DESCRIPTOR,
|
|
683
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_FORMAT,
|
|
684
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_ID,
|
|
685
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_HASH,
|
|
686
|
+
GHOSTGET_MESSAGING_RECEIPT_BINDING_V1_CONTRACT_DESCRIPTOR,
|
|
687
|
+
GHOSTGET_MESSAGING_CONTEXT_INSTANCE_V2_CONTRACT_ID,
|
|
688
|
+
GHOSTGET_MESSAGING_CONTEXT_INSTANCE_V1_CONTRACT_ID,
|
|
689
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_FORMAT,
|
|
690
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_ID,
|
|
691
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_HASH,
|
|
692
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V2_CONTRACT_DESCRIPTOR,
|
|
693
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_FORMAT,
|
|
694
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_ID,
|
|
695
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_HASH,
|
|
696
|
+
GHOSTGET_MESSAGING_CONTEXT_BINDING_V1_CONTRACT_DESCRIPTOR,
|
|
697
|
+
GHOSTGET_MESSAGING_CLIENT_INTENT_BINDING_V1_FORMAT,
|
|
698
|
+
GHOSTGET_MESSAGING_CLIENT_INTENT_BINDING_V1_CONTRACT_ID,
|
|
699
|
+
ARTICLE_DRAFT_DOCUMENT_SCHEMA_VERSION,
|
|
700
|
+
ARTICLE_DRAFT_DOCUMENT_IMAGE_SCHEMA_VERSION
|
|
701
|
+
};
|