@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.
Files changed (500) hide show
  1. package/CHANGELOG.md +458 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1359 -0
  4. package/bunfig.toml +2 -0
  5. package/dist/apple-photos-client.js +704 -0
  6. package/dist/beeper-client.js +4602 -0
  7. package/dist/client.js +1605 -0
  8. package/dist/index-26yq8q16.js +31 -0
  9. package/dist/index-9t13b4k7.js +508 -0
  10. package/dist/index-axwm9b3v.js +5 -0
  11. package/dist/index-gwk7rbyj.js +30 -0
  12. package/dist/index.js +701 -0
  13. package/dist/messaging.js +1130 -0
  14. package/dist/omni-client.js +1406 -0
  15. package/dist/whatsapp-client.js +355 -0
  16. package/docs/imessage-direct-provider.md +106 -0
  17. package/docs/rental-listings.md +94 -0
  18. package/package.json +600 -0
  19. package/skills/ghostget/SKILL.md +251 -0
  20. package/skills/ghostget/agents/openai.yaml +4 -0
  21. package/skills/ghostget/references/adapter-contract.md +181 -0
  22. package/skills/ghostget/references/apple-photos.md +115 -0
  23. package/skills/ghostget/references/article-drafts.md +235 -0
  24. package/skills/ghostget/references/code-owned-provider-scaffold.md +134 -0
  25. package/skills/ghostget/references/cross-posting-video.md +139 -0
  26. package/skills/ghostget/references/cross-posting.md +82 -0
  27. package/skills/ghostget/references/derivation.md +390 -0
  28. package/skills/ghostget/references/hraness-social-profile-stats.json +269 -0
  29. package/skills/ghostget/references/install.md +66 -0
  30. package/skills/ghostget/references/linkedin-adapter.md +442 -0
  31. package/skills/ghostget/references/messaging.md +168 -0
  32. package/skills/ghostget/references/meta-comet-contract.md +153 -0
  33. package/skills/ghostget/references/platform-patterns.md +122 -0
  34. package/skills/ghostget/references/provider-plugins.md +496 -0
  35. package/skills/ghostget/references/reddit-flair.md +78 -0
  36. package/skills/ghostget/references/safety-and-state.md +214 -0
  37. package/skills/ghostget/references/settlement-and-duplicate-cleanup.md +79 -0
  38. package/skills/ghostget/references/social-platform-routing.md +66 -0
  39. package/skills/ghostget/references/social-profile-stats.md +195 -0
  40. package/skills/ghostget/references/social-video-platform-routing.md +89 -0
  41. package/skills/ghostget/references/whatsapp-adapter.md +101 -0
  42. package/skills/ghostget/references/x-adapter.md +332 -0
  43. package/skills/ghostget/references/x-ai-disclosure.md +71 -0
  44. package/src/apple-photos-cli.ts +639 -0
  45. package/src/apple-photos-client-types.ts +168 -0
  46. package/src/apple-photos-client.ts +201 -0
  47. package/src/apple-photos-contact-evidence.ts +838 -0
  48. package/src/apple-photos-local-source.ts +1131 -0
  49. package/src/args.ts +2053 -0
  50. package/src/article-draft-document.ts +417 -0
  51. package/src/article-draft-embeds.ts +123 -0
  52. package/src/article-draft-images.ts +214 -0
  53. package/src/assets/adapter-template/wrench-adapter.json +40 -0
  54. package/src/assets/adapters/beeper/wrench-web-adapter.json +1500 -0
  55. package/src/assets/adapters/beeper/wrench-web-adapter.v1.0.0.json +129 -0
  56. package/src/assets/adapters/beeper/wrench-web-adapter.v1.1.0.json +207 -0
  57. package/src/assets/adapters/beeper/wrench-web-adapter.v2.0.0.json +1463 -0
  58. package/src/assets/adapters/beeper/wrench-web-adapter.v2.1.0.json +1463 -0
  59. package/src/assets/adapters/beeper/wrench-web-adapter.v2.2.0.json +1475 -0
  60. package/src/assets/adapters/beeper/wrench-web-adapter.v2.3.0.json +1488 -0
  61. package/src/assets/adapters/bluesky/wrench-web-adapter.json +684 -0
  62. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.0.0.json +581 -0
  63. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.1.0.json +581 -0
  64. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.2.0.json +581 -0
  65. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.3.0.json +615 -0
  66. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.4.0.json +684 -0
  67. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.5.0.json +684 -0
  68. package/src/assets/adapters/bluesky/wrench-web-adapter.v1.6.0.json +684 -0
  69. package/src/assets/adapters/clasificados/wrench-web-adapter.json +54 -0
  70. package/src/assets/adapters/facebook/wrench-web-adapter.json +750 -0
  71. package/src/assets/adapters/facebook/wrench-web-adapter.v1.0.0.json +706 -0
  72. package/src/assets/adapters/facebook/wrench-web-adapter.v1.1.0.json +703 -0
  73. package/src/assets/adapters/facebook/wrench-web-adapter.v1.2.0.json +750 -0
  74. package/src/assets/adapters/facebook-group/wrench-web-adapter.json +682 -0
  75. package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.0.0.json +583 -0
  76. package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.1.0.json +682 -0
  77. package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.json +437 -0
  78. package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.0.0.json +383 -0
  79. package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.0.json +437 -0
  80. package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.1.json +437 -0
  81. package/src/assets/adapters/facebook-page/wrench-web-adapter.json +880 -0
  82. package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.0.0.json +740 -0
  83. package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.1.0.json +880 -0
  84. package/src/assets/adapters/github/wrench-web-adapter.json +69 -0
  85. package/src/assets/adapters/github/wrench-web-adapter.v1.0.0.json +42 -0
  86. package/src/assets/adapters/github/wrench-web-adapter.v1.1.0.json +69 -0
  87. package/src/assets/adapters/gmail/wrench-adapter.json +161 -0
  88. package/src/assets/adapters/gmail/wrench-adapter.v1.2.0.json +157 -0
  89. package/src/assets/adapters/hacker-news/wrench-web-adapter.json +315 -0
  90. package/src/assets/adapters/hacker-news/wrench-web-adapter.v1.0.0.json +315 -0
  91. package/src/assets/adapters/imessage/wrench-web-adapter.json +236 -0
  92. package/src/assets/adapters/instagram/wrench-web-adapter.json +719 -0
  93. package/src/assets/adapters/instagram/wrench-web-adapter.v1.0.0.json +627 -0
  94. package/src/assets/adapters/instagram/wrench-web-adapter.v1.1.0.json +609 -0
  95. package/src/assets/adapters/instagram/wrench-web-adapter.v1.2.0.json +640 -0
  96. package/src/assets/adapters/instagram/wrench-web-adapter.v1.3.0.json +671 -0
  97. package/src/assets/adapters/instagram/wrench-web-adapter.v1.4.0.json +710 -0
  98. package/src/assets/adapters/instagram/wrench-web-adapter.v1.5.0.json +710 -0
  99. package/src/assets/adapters/instagram/wrench-web-adapter.v1.6.0.json +719 -0
  100. package/src/assets/adapters/instagram/wrench-web-adapter.v1.7.0.json +719 -0
  101. package/src/assets/adapters/linkedin/wrench-adapter.json +442 -0
  102. package/src/assets/adapters/linkedin/wrench-adapter.v0.4.0.json +124 -0
  103. package/src/assets/adapters/linkedin/wrench-adapter.v1.0.0.json +411 -0
  104. package/src/assets/adapters/linkedin/wrench-web-adapter.json +914 -0
  105. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.0.0.json +604 -0
  106. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.1.0.json +604 -0
  107. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.10.0.json +809 -0
  108. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.11.0.json +809 -0
  109. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.12.0.json +820 -0
  110. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.13.0.json +819 -0
  111. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.14.0.json +819 -0
  112. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.15.0.json +819 -0
  113. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.16.0.json +874 -0
  114. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.17.0.json +874 -0
  115. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.18.0.json +874 -0
  116. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.19.0.json +874 -0
  117. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.2.0.json +731 -0
  118. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.3.0.json +768 -0
  119. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.4.0.json +808 -0
  120. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.5.0.json +808 -0
  121. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.6.0.json +808 -0
  122. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.7.0.json +825 -0
  123. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.8.0.json +792 -0
  124. package/src/assets/adapters/linkedin/wrench-web-adapter.v1.9.0.json +809 -0
  125. package/src/assets/adapters/reddit/wrench-web-adapter.json +855 -0
  126. package/src/assets/adapters/reddit/wrench-web-adapter.v1.0.0.json +577 -0
  127. package/src/assets/adapters/reddit/wrench-web-adapter.v1.1.0.json +604 -0
  128. package/src/assets/adapters/reddit/wrench-web-adapter.v1.10.0.json +712 -0
  129. package/src/assets/adapters/reddit/wrench-web-adapter.v1.11.0.json +712 -0
  130. package/src/assets/adapters/reddit/wrench-web-adapter.v1.12.0.json +712 -0
  131. package/src/assets/adapters/reddit/wrench-web-adapter.v1.2.0.json +653 -0
  132. package/src/assets/adapters/reddit/wrench-web-adapter.v1.3.0.json +712 -0
  133. package/src/assets/adapters/reddit/wrench-web-adapter.v1.4.0.json +713 -0
  134. package/src/assets/adapters/reddit/wrench-web-adapter.v1.5.0.json +712 -0
  135. package/src/assets/adapters/reddit/wrench-web-adapter.v1.6.0.json +713 -0
  136. package/src/assets/adapters/reddit/wrench-web-adapter.v1.7.0.json +713 -0
  137. package/src/assets/adapters/reddit/wrench-web-adapter.v1.8.0.json +713 -0
  138. package/src/assets/adapters/reddit/wrench-web-adapter.v1.9.0.json +713 -0
  139. package/src/assets/adapters/substack/wrench-web-adapter.json +936 -0
  140. package/src/assets/adapters/substack/wrench-web-adapter.v1.0.0.json +817 -0
  141. package/src/assets/adapters/substack/wrench-web-adapter.v1.1.0.json +812 -0
  142. package/src/assets/adapters/substack/wrench-web-adapter.v1.2.0.json +812 -0
  143. package/src/assets/adapters/substack/wrench-web-adapter.v1.3.0.json +902 -0
  144. package/src/assets/adapters/substack/wrench-web-adapter.v1.4.0.json +936 -0
  145. package/src/assets/adapters/substack/wrench-web-adapter.v1.5.0.json +936 -0
  146. package/src/assets/adapters/substack/wrench-web-adapter.v1.6.0.json +936 -0
  147. package/src/assets/adapters/threads/wrench-web-adapter.json +692 -0
  148. package/src/assets/adapters/threads/wrench-web-adapter.v1.0.0.json +629 -0
  149. package/src/assets/adapters/threads/wrench-web-adapter.v1.1.0.json +623 -0
  150. package/src/assets/adapters/threads/wrench-web-adapter.v1.2.0.json +622 -0
  151. package/src/assets/adapters/threads/wrench-web-adapter.v1.3.0.json +622 -0
  152. package/src/assets/adapters/threads/wrench-web-adapter.v1.4.0.json +622 -0
  153. package/src/assets/adapters/threads/wrench-web-adapter.v1.5.0.json +699 -0
  154. package/src/assets/adapters/threads/wrench-web-adapter.v1.6.0.json +693 -0
  155. package/src/assets/adapters/threads/wrench-web-adapter.v1.7.0.json +692 -0
  156. package/src/assets/adapters/tiktok/wrench-web-adapter.json +762 -0
  157. package/src/assets/adapters/tiktok/wrench-web-adapter.v1.0.0.json +681 -0
  158. package/src/assets/adapters/tiktok/wrench-web-adapter.v1.1.0.json +708 -0
  159. package/src/assets/adapters/tiktok/wrench-web-adapter.v1.2.0.json +762 -0
  160. package/src/assets/adapters/tiktok/wrench-web-adapter.v1.3.0.json +762 -0
  161. package/src/assets/adapters/twitch/wrench-web-adapter.json +42 -0
  162. package/src/assets/adapters/twitch/wrench-web-adapter.v1.0.0.json +42 -0
  163. package/src/assets/adapters/whatsapp/wrench-web-adapter.json +400 -0
  164. package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.0.0.json +355 -0
  165. package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.1.0.json +386 -0
  166. package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.2.0.json +386 -0
  167. package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.3.0.json +400 -0
  168. package/src/assets/adapters/x/wrench-adapter.json +749 -0
  169. package/src/assets/adapters/x/wrench-adapter.v1.0.0.json +700 -0
  170. package/src/assets/adapters/x/wrench-adapter.v1.1.0.json +707 -0
  171. package/src/assets/adapters/x/wrench-web-adapter.json +712 -0
  172. package/src/assets/adapters/x/wrench-web-adapter.v1.1.0.json +579 -0
  173. package/src/assets/adapters/x/wrench-web-adapter.v1.10.0.json +685 -0
  174. package/src/assets/adapters/x/wrench-web-adapter.v1.11.0.json +712 -0
  175. package/src/assets/adapters/x/wrench-web-adapter.v1.12.0.json +712 -0
  176. package/src/assets/adapters/x/wrench-web-adapter.v1.13.0.json +712 -0
  177. package/src/assets/adapters/x/wrench-web-adapter.v1.2.0.json +578 -0
  178. package/src/assets/adapters/x/wrench-web-adapter.v1.3.0.json +610 -0
  179. package/src/assets/adapters/x/wrench-web-adapter.v1.4.0.json +617 -0
  180. package/src/assets/adapters/x/wrench-web-adapter.v1.5.0.json +634 -0
  181. package/src/assets/adapters/x/wrench-web-adapter.v1.6.0.json +632 -0
  182. package/src/assets/adapters/x/wrench-web-adapter.v1.7.0.json +649 -0
  183. package/src/assets/adapters/x/wrench-web-adapter.v1.8.0.json +649 -0
  184. package/src/assets/adapters/x/wrench-web-adapter.v1.9.0.json +683 -0
  185. package/src/assets/adapters/youtube/wrench-web-adapter.json +561 -0
  186. package/src/assets/adapters/youtube/wrench-web-adapter.v1.0.0.json +465 -0
  187. package/src/assets/adapters/youtube/wrench-web-adapter.v1.1.0.json +519 -0
  188. package/src/assets/adapters/youtube/wrench-web-adapter.v1.2.0.json +561 -0
  189. package/src/assets/adapters/youtube/wrench-web-adapter.v1.3.0.json +561 -0
  190. package/src/assets/code-owned-provider-template/plugin.test.ts.template +54 -0
  191. package/src/assets/code-owned-provider-template/plugin.ts.template +102 -0
  192. package/src/assets/code-owned-provider-template/runtime.internal.test.ts.template +44 -0
  193. package/src/assets/code-owned-provider-template/runtime.ts.template +59 -0
  194. package/src/assets/code-owned-provider-template/wrench-adapter.json.template +33 -0
  195. package/src/assets/fonts/nebula-sans/LICENSE.txt +96 -0
  196. package/src/assets/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
  197. package/src/assets/fonts/nebula-sans/PROVENANCE.md +14 -0
  198. package/src/assets.d.ts +4 -0
  199. package/src/auth.ts +1157 -0
  200. package/src/beeper-client-types.ts +169 -0
  201. package/src/beeper-client.ts +250 -0
  202. package/src/beeper-contact-interactions-cli.ts +180 -0
  203. package/src/beeper-contact-interactions.ts +1612 -0
  204. package/src/beeper-message-bundle-v1.ts +257 -0
  205. package/src/beeper-message-like-me-cli.ts +84 -0
  206. package/src/beeper-message-like-me-export.ts +2274 -0
  207. package/src/beeper-message-like-me-recovery.ts +931 -0
  208. package/src/beeper-message-like-me-source.ts +4034 -0
  209. package/src/browser-admission.ts +928 -0
  210. package/src/browser-snapshots.ts +260 -0
  211. package/src/browser.ts +3873 -0
  212. package/src/canonical-json.ts +60 -0
  213. package/src/catalog-cli.ts +638 -0
  214. package/src/cli.ts +208 -0
  215. package/src/client-types.ts +301 -0
  216. package/src/client.ts +2726 -0
  217. package/src/confirmed-write-failure.ts +44 -0
  218. package/src/confirmed-write-model.ts +72 -0
  219. package/src/confirmed-write-platform.ts +1055 -0
  220. package/src/confirmed-write-program.ts +224 -0
  221. package/src/confirmed-write-runtime.ts +16 -0
  222. package/src/cursor-token.ts +228 -0
  223. package/src/derivation-dnr-readiness.ts +367 -0
  224. package/src/derivation-file-chooser.ts +384 -0
  225. package/src/derivation-network-boundary.ts +835 -0
  226. package/src/derivation-network-guard.ts +782 -0
  227. package/src/derivation-network-proxy-helper.ts +440 -0
  228. package/src/derivation-network-proxy.ts +385 -0
  229. package/src/derive-command-helper.ts +693 -0
  230. package/src/derive-fixtures.ts +343 -0
  231. package/src/derive-review.ts +980 -0
  232. package/src/derive.ts +4754 -0
  233. package/src/fixtures/beeper-message-like-me-v1/accounts.ndjson +2 -0
  234. package/src/fixtures/beeper-message-like-me-v1/conversations.ndjson +1 -0
  235. package/src/fixtures/beeper-message-like-me-v1/manifest.json +1 -0
  236. package/src/fixtures/beeper-message-like-me-v1/messages.ndjson +2 -0
  237. package/src/fixtures/beeper-message-like-me-v1/participants.ndjson +3 -0
  238. package/src/fixtures/beeper-message-like-me-v1/reactions.ndjson +1 -0
  239. package/src/fixtures/beeper-message-like-me-v1/tombstones.ndjson +1 -0
  240. package/src/ghostget.ts +3672 -0
  241. package/src/gmail-capture.ts +1244 -0
  242. package/src/har-internal.ts +1242 -0
  243. package/src/har.ts +743 -0
  244. package/src/index.ts +218 -0
  245. package/src/invocation-read-platform.ts +55 -0
  246. package/src/invocation-read-program.ts +93 -0
  247. package/src/invocation-read-runtime.ts +11 -0
  248. package/src/linked-device-lifecycle-admission.ts +450 -0
  249. package/src/linked-device-lifecycle-journal.ts +1560 -0
  250. package/src/linked-device-lifecycle-runtime.ts +1602 -0
  251. package/src/local-cli-admission.ts +135 -0
  252. package/src/local-cli-contracts.ts +271 -0
  253. package/src/local-cli-execution.ts +98 -0
  254. package/src/local-cli-surface-contract.ts +1510 -0
  255. package/src/local-cli-tool-identity.ts +336 -0
  256. package/src/media/archive.ts +2325 -0
  257. package/src/media/args.ts +303 -0
  258. package/src/media/cli.ts +287 -0
  259. package/src/media/doctor.ts +475 -0
  260. package/src/media/ffmpeg.ts +1330 -0
  261. package/src/media/http-capture.ts +711 -0
  262. package/src/media/http-probe.ts +593 -0
  263. package/src/media/http.ts +387 -0
  264. package/src/media/index.ts +10 -0
  265. package/src/media/local-transcription.ts +613 -0
  266. package/src/media/lock.ts +321 -0
  267. package/src/media/manifest.ts +1712 -0
  268. package/src/media/metadata.ts +906 -0
  269. package/src/media/process.ts +723 -0
  270. package/src/media/revision.ts +166 -0
  271. package/src/media/runtime-closure.ts +1063 -0
  272. package/src/media/source-router.ts +187 -0
  273. package/src/media/transcriber-config.ts +1122 -0
  274. package/src/media/transcript-persistence-model.ts +15 -0
  275. package/src/media/transcript-persistence-platform.ts +89 -0
  276. package/src/media/transcript-persistence-program.ts +39 -0
  277. package/src/media/transcript-persistence-runtime.ts +24 -0
  278. package/src/media/transcript.ts +616 -0
  279. package/src/media/utf8-order.ts +30 -0
  280. package/src/media/whisper-cpp.ts +464 -0
  281. package/src/media/whisper-language.ts +58 -0
  282. package/src/media/yt-dlp.ts +439 -0
  283. package/src/message-like-me-agentic-messaging.ts +882 -0
  284. package/src/messaging-action-store.ts +793 -0
  285. package/src/messaging-runtime.ts +2136 -0
  286. package/src/messaging-store.ts +539 -0
  287. package/src/messaging-types.ts +1663 -0
  288. package/src/messaging.ts +334 -0
  289. package/src/model.ts +2671 -0
  290. package/src/oauth-google.ts +888 -0
  291. package/src/omni-client-types.ts +306 -0
  292. package/src/omni-client.ts +2225 -0
  293. package/src/omni-limits.ts +34 -0
  294. package/src/omni-model.ts +1614 -0
  295. package/src/omni-request.ts +379 -0
  296. package/src/omni-runtime.ts +1632 -0
  297. package/src/operation-deadline.ts +189 -0
  298. package/src/path-helper.ts +1656 -0
  299. package/src/pinned-https.ts +194 -0
  300. package/src/plan-assets.ts +832 -0
  301. package/src/platform-catalog.ts +1832 -0
  302. package/src/plugins/beeper-linked-device/plugin.ts +310 -0
  303. package/src/plugins/bluesky-web/plugin.ts +178 -0
  304. package/src/plugins/clasificados-web/plugin.ts +66 -0
  305. package/src/plugins/github-web/plugin.ts +80 -0
  306. package/src/plugins/gmail-official/plugin.ts +110 -0
  307. package/src/plugins/hacker-news-web/plugin.ts +52 -0
  308. package/src/plugins/imessage-direct/plugin.ts +195 -0
  309. package/src/plugins/imessage-direct/vendor/0001-fix-keep-AppleScript-send-payloads-out-of-child-argv.patch +1430 -0
  310. package/src/plugins/imessage-direct/vendor/0002-feat-rpc-add-exact-chat-lookup.patch +225 -0
  311. package/src/plugins/imessage-direct/vendor/provenance.json +80 -0
  312. package/src/plugins/linkedin-official/plugin.ts +84 -0
  313. package/src/plugins/linkedin-web/plugin.ts +412 -0
  314. package/src/plugins/meta-web/plugin.ts +317 -0
  315. package/src/plugins/reddit-web/flair.ts +492 -0
  316. package/src/plugins/reddit-web/plugin.ts +477 -0
  317. package/src/plugins/substack-web/plugin.ts +124 -0
  318. package/src/plugins/tiktok-web/plugin.ts +67 -0
  319. package/src/plugins/twitch-web/plugin.ts +54 -0
  320. package/src/plugins/whatsapp-linked-device/plugin.ts +105 -0
  321. package/src/plugins/x-official/plugin.ts +64 -0
  322. package/src/plugins/x-web/plugin.ts +488 -0
  323. package/src/plugins/youtube-web/plugin.ts +101 -0
  324. package/src/portable-run-recovery.ts +466 -0
  325. package/src/process-identity.ts +501 -0
  326. package/src/profile-clone-helper.ts +104 -0
  327. package/src/provider-catalog-views.ts +51 -0
  328. package/src/provider-context.ts +69 -0
  329. package/src/provider-contract-definitions-x.ts +45 -0
  330. package/src/provider-contract-definitions.ts +948 -0
  331. package/src/provider-contract-input-gmail.ts +176 -0
  332. package/src/provider-contract-input-linkedin.ts +77 -0
  333. package/src/provider-contract-input-x.ts +304 -0
  334. package/src/provider-contract-planning.ts +23 -0
  335. package/src/provider-contract-semantic-identity.ts +54 -0
  336. package/src/provider-contracts.ts +251 -0
  337. package/src/provider-http.ts +723 -0
  338. package/src/provider-plugin-auth.ts +36 -0
  339. package/src/provider-plugin-builtins.ts +229 -0
  340. package/src/provider-plugin-cleanup-barrier.ts +229 -0
  341. package/src/provider-plugin-cleanup-execution.ts +79 -0
  342. package/src/provider-plugin-cleanup-resource.ts +470 -0
  343. package/src/provider-plugin-contract-identity.ts +707 -0
  344. package/src/provider-plugin-host.ts +1972 -0
  345. package/src/provider-plugin-identifiers.ts +60 -0
  346. package/src/provider-plugin-invocation-lease.ts +889 -0
  347. package/src/provider-plugin-lifecycle-kernel.ts +566 -0
  348. package/src/provider-plugin-lifecycle.ts +1455 -0
  349. package/src/provider-plugin-module-analysis.ts +336 -0
  350. package/src/provider-plugin-package.ts +2530 -0
  351. package/src/provider-plugin-portable-authority.ts +106 -0
  352. package/src/provider-plugin-portable-catalog.ts +94 -0
  353. package/src/provider-plugin-portable-identity.ts +315 -0
  354. package/src/provider-plugin-portable-runtime.ts +2057 -0
  355. package/src/provider-plugin-protocol.ts +1625 -0
  356. package/src/provider-plugin-registry.ts +3342 -0
  357. package/src/provider-plugin-store.ts +2155 -0
  358. package/src/provider-plugin-test-fixture.ts +5 -0
  359. package/src/provider-plugin.ts +4907 -0
  360. package/src/provider-plugins.generated.ts +43 -0
  361. package/src/provider-plugins.ts +8 -0
  362. package/src/provider-subject.ts +41 -0
  363. package/src/provider.ts +315 -0
  364. package/src/providers/beeper-local-runtime.ts +5426 -0
  365. package/src/providers/beeper-local.ts +2739 -0
  366. package/src/providers/beeper-messaging.ts +462 -0
  367. package/src/providers/beeper-omni.ts +1159 -0
  368. package/src/providers/bluesky-web-runtime.ts +2895 -0
  369. package/src/providers/bluesky-web.ts +1614 -0
  370. package/src/providers/clasificados-web-runtime.ts +255 -0
  371. package/src/providers/clasificados-web.ts +503 -0
  372. package/src/providers/contact-projection.ts +301 -0
  373. package/src/providers/github-read-model.ts +94 -0
  374. package/src/providers/github-read-platform.ts +165 -0
  375. package/src/providers/github-read-program.ts +97 -0
  376. package/src/providers/github-web-runtime.ts +320 -0
  377. package/src/providers/github-web.ts +403 -0
  378. package/src/providers/gmail-api.ts +2834 -0
  379. package/src/providers/gmail-omni.ts +830 -0
  380. package/src/providers/gmail.ts +1130 -0
  381. package/src/providers/hacker-news-web-runtime.ts +220 -0
  382. package/src/providers/hacker-news-web.ts +809 -0
  383. package/src/providers/imessage-direct-install.ts +354 -0
  384. package/src/providers/imessage-direct-messaging.ts +532 -0
  385. package/src/providers/imessage-direct-omni.ts +400 -0
  386. package/src/providers/imessage-direct-runtime.ts +1498 -0
  387. package/src/providers/imessage-direct.ts +351 -0
  388. package/src/providers/instagram-video-foundations.ts +913 -0
  389. package/src/providers/instagram-web-profile-browser.ts +600 -0
  390. package/src/providers/iso-bmff.ts +338 -0
  391. package/src/providers/linkedin-company-platform.ts +42 -0
  392. package/src/providers/linkedin-company-program.ts +88 -0
  393. package/src/providers/linkedin-contact-failure.ts +84 -0
  394. package/src/providers/linkedin-contact-platform.ts +45 -0
  395. package/src/providers/linkedin-contact-program.ts +91 -0
  396. package/src/providers/linkedin-profile-activity-failure.ts +76 -0
  397. package/src/providers/linkedin-profile-activity-platform.ts +41 -0
  398. package/src/providers/linkedin-profile-activity-program.ts +67 -0
  399. package/src/providers/linkedin-read-failure.ts +52 -0
  400. package/src/providers/linkedin-self-platform.ts +53 -0
  401. package/src/providers/linkedin-self-program.ts +122 -0
  402. package/src/providers/linkedin-web-article-browser.ts +794 -0
  403. package/src/providers/linkedin-web-bootstrap.ts +146 -0
  404. package/src/providers/linkedin-web-contact.ts +830 -0
  405. package/src/providers/linkedin-web-feed-browser.ts +832 -0
  406. package/src/providers/linkedin-web-feed.ts +864 -0
  407. package/src/providers/linkedin-web-post-browser.ts +653 -0
  408. package/src/providers/linkedin-web-profile-browser.ts +683 -0
  409. package/src/providers/linkedin-web-runtime.ts +2388 -0
  410. package/src/providers/linkedin-web.ts +3305 -0
  411. package/src/providers/linkedin.ts +1885 -0
  412. package/src/providers/meta-bootstrap.ts +1043 -0
  413. package/src/providers/meta-facebook-group.ts +690 -0
  414. package/src/providers/meta-marketplace-relay.ts +747 -0
  415. package/src/providers/meta-omni.ts +373 -0
  416. package/src/providers/meta-relay-bundle.ts +1049 -0
  417. package/src/providers/meta-web-descriptors.ts +1740 -0
  418. package/src/providers/meta-web-runtime.ts +3388 -0
  419. package/src/providers/meta-web.ts +2931 -0
  420. package/src/providers/read-failure.ts +139 -0
  421. package/src/providers/reddit-omni.ts +462 -0
  422. package/src/providers/reddit-web-runtime.ts +1929 -0
  423. package/src/providers/reddit-web.ts +1611 -0
  424. package/src/providers/rental-listings.ts +460 -0
  425. package/src/providers/substack-omni.ts +406 -0
  426. package/src/providers/substack-video-mp4.ts +33 -0
  427. package/src/providers/substack-web-runtime.ts +2812 -0
  428. package/src/providers/substack-web.ts +1502 -0
  429. package/src/providers/tiktok-video-mp4.ts +33 -0
  430. package/src/providers/tiktok-web-runtime.ts +770 -0
  431. package/src/providers/tiktok-web.ts +2786 -0
  432. package/src/providers/twitch-web-runtime.ts +226 -0
  433. package/src/providers/twitch-web.ts +274 -0
  434. package/src/providers/whatsapp-account-identity.ts +55 -0
  435. package/src/providers/whatsapp-contact-projection-helper.ts +874 -0
  436. package/src/providers/whatsapp-contact-projection-protocol.ts +403 -0
  437. package/src/providers/whatsapp-interaction-projection-helper.ts +1452 -0
  438. package/src/providers/whatsapp-interaction-projection-protocol.ts +462 -0
  439. package/src/providers/whatsapp-message-export-projection-protocol.ts +532 -0
  440. package/src/providers/whatsapp-messaging.ts +132 -0
  441. package/src/providers/whatsapp-omni.ts +586 -0
  442. package/src/providers/whatsapp-web-runtime.ts +3108 -0
  443. package/src/providers/whatsapp-web.ts +1037 -0
  444. package/src/providers/x-image-provenance.ts +523 -0
  445. package/src/providers/x-made-with-ai.ts +106 -0
  446. package/src/providers/x-transaction-id.ts +413 -0
  447. package/src/providers/x-web-runtime.ts +3485 -0
  448. package/src/providers/x-web.ts +2332 -0
  449. package/src/providers/x.ts +1889 -0
  450. package/src/providers/youtube-web-runtime.ts +1400 -0
  451. package/src/providers/youtube-web.ts +1221 -0
  452. package/src/read-admission-runtime.ts +91 -0
  453. package/src/read-client.ts +521 -0
  454. package/src/read-effect-platform.ts +7 -0
  455. package/src/read-effect-runtime.ts +14 -0
  456. package/src/read-effect.ts +52 -0
  457. package/src/read-projection-admission.ts +866 -0
  458. package/src/read-projections.ts +3151 -0
  459. package/src/recovery.ts +1492 -0
  460. package/src/reviewed-template.ts +146 -0
  461. package/src/run-journal.ts +1272 -0
  462. package/src/runtime.ts +5116 -0
  463. package/src/scripts/generate-provider-plugin-catalog.ts +121 -0
  464. package/src/scripts/install-whatsapp-protocol.sh +232 -0
  465. package/src/scripts/recover-install-stages.ts +1491 -0
  466. package/src/scripts/resolve-state-home.ts +30 -0
  467. package/src/scripts/scaffold-web-provider.ts +973 -0
  468. package/src/scripts/sync-bundled-adapters.ts +695 -0
  469. package/src/session-secrets.ts +1183 -0
  470. package/src/state-helper.bunfig.toml +2 -0
  471. package/src/state-helper.ts +2914 -0
  472. package/src/storage.ts +3842 -0
  473. package/src/transport-policy.ts +2 -0
  474. package/src/usage.ts +182 -0
  475. package/src/version.ts +2 -0
  476. package/src/web-session-authentication-policy.ts +136 -0
  477. package/src/web-session-cleanup-admission.ts +2344 -0
  478. package/src/web-session-cleanup-join.ts +99 -0
  479. package/src/web-session-client.ts +996 -0
  480. package/src/web-session-contract-definitions.ts +820 -0
  481. package/src/web-session-contract-planning.ts +42 -0
  482. package/src/web-session-contracts.ts +228 -0
  483. package/src/web-session-cookies.ts +500 -0
  484. package/src/web-session-execution.ts +385 -0
  485. package/src/web-session-http.ts +373 -0
  486. package/src/web-session-read-errors.ts +19 -0
  487. package/src/web-session-read-runtime.ts +124 -0
  488. package/src/web-session-recovery.ts +818 -0
  489. package/src/web-session-sites.ts +58 -0
  490. package/src/web-session-template.ts +994 -0
  491. package/src/web-session.ts +93 -0
  492. package/src/whatsapp-client-binding.ts +21 -0
  493. package/src/whatsapp-client-types.ts +75 -0
  494. package/src/whatsapp-client.ts +395 -0
  495. package/src/whatsapp-export-coordinate.ts +17 -0
  496. package/src/whatsapp-message-bundle-v2.ts +195 -0
  497. package/src/whatsapp-message-like-me-cli.ts +195 -0
  498. package/src/whatsapp-message-like-me-export.ts +1072 -0
  499. package/src/whatsapp-message-like-me-source.ts +1012 -0
  500. package/tsconfig.json +67 -0
@@ -0,0 +1,855 @@
1
+ {
2
+ "schemaVersion": 4,
3
+ "id": "reddit-web",
4
+ "version": "1.13.0",
5
+ "displayName": "Reddit (Authenticated Web API)",
6
+ "surfaceId": "reddit",
7
+ "origins": [
8
+ "https://www.reddit.com"
9
+ ],
10
+ "browserDomains": [
11
+ "www.reddit.com"
12
+ ],
13
+ "operations": {
14
+ "flair.user.choices": {
15
+ "description": "Observed contract: read current-account user flair choices through the exact old-Reddit selector exchange.",
16
+ "risk": "R1",
17
+ "sideEffect": "none",
18
+ "idempotency": "none",
19
+ "dedupeWindowMs": 0,
20
+ "input": {
21
+ "properties": {
22
+ "community": {
23
+ "type": "string",
24
+ "description": "Exact subreddit name without r/",
25
+ "minLength": 2,
26
+ "maxLength": 21
27
+ }
28
+ },
29
+ "required": [
30
+ "community"
31
+ ]
32
+ },
33
+ "webSession": {
34
+ "site": "reddit",
35
+ "action": "flair.user.choices",
36
+ "contractVersion": 1,
37
+ "timeoutMs": 60000,
38
+ "maxOutputBytes": 524288
39
+ }
40
+ },
41
+ "flair.user.select": {
42
+ "description": "Capture-required contract reservation: select one current-account community user flair; no live request is installed.",
43
+ "risk": "R2",
44
+ "sideEffect": "Select one community user flair for the current account",
45
+ "idempotency": "local-at-most-once",
46
+ "dedupeWindowMs": 300000,
47
+ "input": {
48
+ "properties": {
49
+ "community": {
50
+ "type": "string",
51
+ "description": "Exact subreddit name without r/",
52
+ "minLength": 2,
53
+ "maxLength": 21
54
+ },
55
+ "template_id": {
56
+ "type": "string",
57
+ "description": "Exact self-selectable template ID from a fresh choices read",
58
+ "minLength": 36,
59
+ "maxLength": 36
60
+ },
61
+ "expected_text": {
62
+ "type": "string",
63
+ "description": "Exact label from that same choices read; not custom flair text",
64
+ "minLength": 1,
65
+ "maxLength": 256
66
+ }
67
+ },
68
+ "required": [
69
+ "community",
70
+ "template_id",
71
+ "expected_text"
72
+ ]
73
+ },
74
+ "webSession": {
75
+ "site": "reddit",
76
+ "action": "flair.user.select",
77
+ "contractVersion": 1,
78
+ "timeoutMs": 60000,
79
+ "maxOutputBytes": 524288
80
+ }
81
+ },
82
+ "flair.post.choices": {
83
+ "description": "Observed contract: read available flair choices for a new post through the exact old-Reddit selector exchange.",
84
+ "risk": "R1",
85
+ "sideEffect": "none",
86
+ "idempotency": "none",
87
+ "dedupeWindowMs": 0,
88
+ "input": {
89
+ "properties": {
90
+ "community": {
91
+ "type": "string",
92
+ "description": "Exact subreddit name without r/",
93
+ "minLength": 2,
94
+ "maxLength": 21
95
+ }
96
+ },
97
+ "required": [
98
+ "community"
99
+ ]
100
+ },
101
+ "webSession": {
102
+ "site": "reddit",
103
+ "action": "flair.post.choices",
104
+ "contractVersion": 1,
105
+ "timeoutMs": 60000,
106
+ "maxOutputBytes": 524288
107
+ }
108
+ },
109
+ "flair.post.select": {
110
+ "description": "Capture-required contract reservation: select one flair on an owned post; no live request is installed.",
111
+ "risk": "R3",
112
+ "sideEffect": "Select one flair on the current account's exact post",
113
+ "idempotency": "local-at-most-once",
114
+ "dedupeWindowMs": 300000,
115
+ "input": {
116
+ "properties": {
117
+ "community": {
118
+ "type": "string",
119
+ "description": "Exact subreddit name without r/",
120
+ "minLength": 2,
121
+ "maxLength": 21
122
+ },
123
+ "post_id": {
124
+ "type": "string",
125
+ "description": "Exact t3_ fullname of the current account's post",
126
+ "minLength": 4,
127
+ "maxLength": 35
128
+ },
129
+ "template_id": {
130
+ "type": "string",
131
+ "description": "Exact self-selectable template ID from a fresh choices read",
132
+ "minLength": 36,
133
+ "maxLength": 36
134
+ },
135
+ "expected_text": {
136
+ "type": "string",
137
+ "description": "Exact label from that same choices read; not custom flair text",
138
+ "minLength": 1,
139
+ "maxLength": 256
140
+ }
141
+ },
142
+ "required": [
143
+ "community",
144
+ "post_id",
145
+ "template_id",
146
+ "expected_text"
147
+ ]
148
+ },
149
+ "webSession": {
150
+ "site": "reddit",
151
+ "action": "flair.post.select",
152
+ "contractVersion": 1,
153
+ "timeoutMs": 60000,
154
+ "maxOutputBytes": 524288
155
+ }
156
+ },
157
+ "profiles.read": {
158
+ "description": "Observed contract: read exact follower and karma counts for the viewer-bound current Reddit profile, then count the complete visible overview listing for the contributions metric.",
159
+ "risk": "R1",
160
+ "sideEffect": "none",
161
+ "idempotency": "none",
162
+ "dedupeWindowMs": 0,
163
+ "input": {
164
+ "properties": {
165
+ "profile": {
166
+ "type": "string",
167
+ "description": "Exact Reddit profile handle without u/",
168
+ "minLength": 1,
169
+ "maxLength": 64
170
+ }
171
+ },
172
+ "required": [
173
+ "profile"
174
+ ]
175
+ },
176
+ "webSession": {
177
+ "site": "reddit",
178
+ "action": "profiles.read",
179
+ "contractVersion": 1,
180
+ "timeoutMs": 60000,
181
+ "maxOutputBytes": 4194304
182
+ }
183
+ },
184
+ "feeds.read": {
185
+ "description": "Observed contract: read one bounded signed-in Reddit home Listing through the exact JSON endpoint with explicit raw JSON and fullname pagination.",
186
+ "risk": "R1",
187
+ "sideEffect": "none",
188
+ "idempotency": "none",
189
+ "dedupeWindowMs": 0,
190
+ "input": {
191
+ "properties": {
192
+ "feed": {
193
+ "type": "string",
194
+ "description": "Exact reviewed Reddit feed",
195
+ "enum": [
196
+ "home"
197
+ ]
198
+ },
199
+ "after": {
200
+ "type": "string",
201
+ "description": "Fullname cursor returned by the preceding Listing",
202
+ "minLength": 4,
203
+ "maxLength": 40
204
+ },
205
+ "limit": {
206
+ "type": "number",
207
+ "description": "Maximum posts in the complete Listing page",
208
+ "minimum": 1,
209
+ "maximum": 100
210
+ }
211
+ },
212
+ "required": [
213
+ "feed"
214
+ ]
215
+ },
216
+ "webSession": {
217
+ "site": "reddit",
218
+ "action": "feeds.read",
219
+ "contractVersion": 1,
220
+ "timeoutMs": 60000,
221
+ "maxOutputBytes": 4194304
222
+ }
223
+ },
224
+ "posts.read": {
225
+ "description": "Observed contract: read one exact Reddit post from the root of its target-bound comments Listing.",
226
+ "risk": "R1",
227
+ "sideEffect": "none",
228
+ "idempotency": "none",
229
+ "dedupeWindowMs": 0,
230
+ "input": {
231
+ "properties": {
232
+ "post_id": {
233
+ "type": "string",
234
+ "description": "Exact t3_ Reddit post fullname",
235
+ "minLength": 4,
236
+ "maxLength": 40
237
+ }
238
+ },
239
+ "required": [
240
+ "post_id"
241
+ ]
242
+ },
243
+ "webSession": {
244
+ "site": "reddit",
245
+ "action": "posts.read",
246
+ "contractVersion": 1,
247
+ "timeoutMs": 60000,
248
+ "maxOutputBytes": 4194304
249
+ }
250
+ },
251
+ "comments.read": {
252
+ "description": "Observed contract: read one bounded Reddit comment tree through the exact target-bound comments Listing without acknowledgement traffic.",
253
+ "risk": "R1",
254
+ "sideEffect": "none",
255
+ "idempotency": "none",
256
+ "dedupeWindowMs": 0,
257
+ "input": {
258
+ "properties": {
259
+ "post_id": {
260
+ "type": "string",
261
+ "description": "Exact t3_ Reddit post fullname",
262
+ "minLength": 4,
263
+ "maxLength": 40
264
+ },
265
+ "limit": {
266
+ "type": "number",
267
+ "description": "Maximum projected comments",
268
+ "minimum": 1,
269
+ "maximum": 100
270
+ }
271
+ },
272
+ "required": [
273
+ "post_id"
274
+ ]
275
+ },
276
+ "webSession": {
277
+ "site": "reddit",
278
+ "action": "comments.read",
279
+ "contractVersion": 1,
280
+ "timeoutMs": 60000,
281
+ "maxOutputBytes": 4194304
282
+ }
283
+ },
284
+ "messaging.list": {
285
+ "description": "Observed contract: list one bounded legacy Reddit inbox, unread, or sent Listing with mark=false and no expanded replies.",
286
+ "risk": "R1",
287
+ "sideEffect": "none",
288
+ "idempotency": "none",
289
+ "dedupeWindowMs": 0,
290
+ "input": {
291
+ "properties": {
292
+ "folder": {
293
+ "type": "string",
294
+ "description": "Exact legacy Reddit message folder",
295
+ "enum": [
296
+ "inbox",
297
+ "unread",
298
+ "sent"
299
+ ]
300
+ },
301
+ "after": {
302
+ "type": "string",
303
+ "description": "Fullname cursor returned by the preceding Listing",
304
+ "minLength": 4,
305
+ "maxLength": 40
306
+ },
307
+ "limit": {
308
+ "type": "number",
309
+ "description": "Maximum messages or notifications in the Listing",
310
+ "minimum": 1,
311
+ "maximum": 100
312
+ }
313
+ },
314
+ "required": [
315
+ "folder"
316
+ ]
317
+ },
318
+ "webSession": {
319
+ "site": "reddit",
320
+ "action": "messaging.list",
321
+ "contractVersion": 1,
322
+ "timeoutMs": 60000,
323
+ "maxOutputBytes": 4194304
324
+ }
325
+ },
326
+ "messaging.read": {
327
+ "description": "Observed contract: read one exact legacy Reddit message thread through the selected Listing folder's mid filter with mark=false.",
328
+ "risk": "R1",
329
+ "sideEffect": "none",
330
+ "idempotency": "none",
331
+ "dedupeWindowMs": 0,
332
+ "input": {
333
+ "properties": {
334
+ "folder": {
335
+ "type": "string",
336
+ "description": "Exact legacy Reddit message folder containing the target",
337
+ "enum": [
338
+ "inbox",
339
+ "unread",
340
+ "sent"
341
+ ]
342
+ },
343
+ "message_id": {
344
+ "type": "string",
345
+ "description": "Exact t4_ Reddit message fullname",
346
+ "minLength": 4,
347
+ "maxLength": 40
348
+ }
349
+ },
350
+ "required": [
351
+ "folder",
352
+ "message_id"
353
+ ]
354
+ },
355
+ "webSession": {
356
+ "site": "reddit",
357
+ "action": "messaging.read",
358
+ "contractVersion": 1,
359
+ "timeoutMs": 60000,
360
+ "maxOutputBytes": 4194304
361
+ }
362
+ },
363
+ "reactions.set": {
364
+ "description": "Capture-required contract reservation: the exact /api/vote implementation and independent target readback are deterministic-test proven, but an authorized low-stakes live fixture is still required.",
365
+ "risk": "R2",
366
+ "sideEffect": "Casts one human-confirmed vote direction on the exact Reddit link or comment; Reddit requires votes to proxy a human action one-for-one.",
367
+ "idempotency": "local-at-most-once",
368
+ "dedupeWindowMs": 86400000,
369
+ "input": {
370
+ "properties": {
371
+ "thing_id": {
372
+ "type": "string",
373
+ "description": "Exact t1_ comment or t3_ post fullname",
374
+ "minLength": 4,
375
+ "maxLength": 40
376
+ },
377
+ "direction": {
378
+ "type": "number",
379
+ "description": "Exact desired vote direction: -1 down, 0 neutral, or 1 up",
380
+ "enum": [
381
+ -1,
382
+ 0,
383
+ 1
384
+ ]
385
+ }
386
+ },
387
+ "required": [
388
+ "thing_id",
389
+ "direction"
390
+ ]
391
+ },
392
+ "webSession": {
393
+ "site": "reddit",
394
+ "action": "reactions.set",
395
+ "contractVersion": 1,
396
+ "timeoutMs": 60000,
397
+ "maxOutputBytes": 2097152
398
+ }
399
+ },
400
+ "content.save": {
401
+ "description": "Capture-required contract reservation: the exact /api/save and /api/unsave implementation and independent target readback are deterministic-test proven, but an authorized low-stakes live fixture is still required.",
402
+ "risk": "R2",
403
+ "sideEffect": "Saves or unsaves the exact confirmed Reddit post or comment for the authenticated account.",
404
+ "idempotency": "local-at-most-once",
405
+ "dedupeWindowMs": 86400000,
406
+ "input": {
407
+ "properties": {
408
+ "thing_id": {
409
+ "type": "string",
410
+ "description": "Exact t1_ comment or t3_ post fullname",
411
+ "minLength": 4,
412
+ "maxLength": 40
413
+ },
414
+ "saved": {
415
+ "type": "boolean",
416
+ "description": "Exact desired saved state"
417
+ }
418
+ },
419
+ "required": [
420
+ "thing_id",
421
+ "saved"
422
+ ]
423
+ },
424
+ "webSession": {
425
+ "site": "reddit",
426
+ "action": "content.save",
427
+ "contractVersion": 1,
428
+ "timeoutMs": 60000,
429
+ "maxOutputBytes": 2097152
430
+ }
431
+ },
432
+ "content.delete": {
433
+ "description": "Observed contract: delete one exact current-account Reddit post only after an authored-post pre-read binds its confirmed title, then independently verify exact-target absence.",
434
+ "risk": "R3",
435
+ "sideEffect": "Permanently deletes the exact confirmed Reddit post authored by the authenticated account.",
436
+ "idempotency": "local-at-most-once",
437
+ "dedupeWindowMs": 2592000000,
438
+ "input": {
439
+ "properties": {
440
+ "post_id": {
441
+ "type": "string",
442
+ "description": "Exact t3_ Reddit post fullname",
443
+ "minLength": 4,
444
+ "maxLength": 40
445
+ },
446
+ "expected_title": {
447
+ "type": "string",
448
+ "description": "Exact current post title used for pre-delete confirmation",
449
+ "minLength": 1,
450
+ "maxLength": 280
451
+ }
452
+ },
453
+ "required": [
454
+ "post_id",
455
+ "expected_title"
456
+ ]
457
+ },
458
+ "webSession": {
459
+ "site": "reddit",
460
+ "action": "content.delete",
461
+ "contractVersion": 1,
462
+ "timeoutMs": 60000,
463
+ "maxOutputBytes": 4194304
464
+ }
465
+ },
466
+ "communities.membership.set": {
467
+ "description": "Capture-required contract reservation: subscribe to or unsubscribe from one exact subreddit only after form variants, actor binding, and independent membership readback are reviewed.",
468
+ "risk": "R2",
469
+ "sideEffect": "Joins or leaves the exact confirmed Reddit community for the authenticated account.",
470
+ "idempotency": "local-at-most-once",
471
+ "dedupeWindowMs": 86400000,
472
+ "input": {
473
+ "properties": {
474
+ "community_id": {
475
+ "type": "string",
476
+ "description": "Exact t5_ subreddit fullname",
477
+ "minLength": 4,
478
+ "maxLength": 40
479
+ },
480
+ "joined": {
481
+ "type": "boolean",
482
+ "description": "Exact desired community membership state"
483
+ }
484
+ },
485
+ "required": [
486
+ "community_id",
487
+ "joined"
488
+ ]
489
+ },
490
+ "webSession": {
491
+ "site": "reddit",
492
+ "action": "communities.membership.set",
493
+ "contractVersion": 1,
494
+ "timeoutMs": 60000,
495
+ "maxOutputBytes": 2097152
496
+ }
497
+ },
498
+ "relationships.follow.set": {
499
+ "description": "Capture-required contract reservation: follow or unfollow one exact Reddit target only after the target class, mutation, and independent relationship readback are reviewed.",
500
+ "risk": "R2",
501
+ "sideEffect": "Sets the authenticated Reddit account's follow state for the exact confirmed target.",
502
+ "idempotency": "local-at-most-once",
503
+ "dedupeWindowMs": 86400000,
504
+ "input": {
505
+ "properties": {
506
+ "target_id": {
507
+ "type": "string",
508
+ "description": "Exact reviewed Reddit target fullname",
509
+ "minLength": 4,
510
+ "maxLength": 40
511
+ },
512
+ "followed": {
513
+ "type": "boolean",
514
+ "description": "Exact desired follow state"
515
+ }
516
+ },
517
+ "required": [
518
+ "target_id",
519
+ "followed"
520
+ ]
521
+ },
522
+ "webSession": {
523
+ "site": "reddit",
524
+ "action": "relationships.follow.set",
525
+ "contractVersion": 1,
526
+ "timeoutMs": 60000,
527
+ "maxOutputBytes": 2097152
528
+ }
529
+ },
530
+ "media.read": {
531
+ "description": "Observed contract: read one exact Reddit-hosted video post through the current-account-bound /api/info exchange and return a closed metadata-only projection. The output contains post identity, descriptive fields, dimensions, duration, safety flags, and completed status; it omits canonical, fallback, signed, and expiring playback URLs or credentials.",
532
+ "risk": "R1",
533
+ "sideEffect": "none",
534
+ "idempotency": "none",
535
+ "dedupeWindowMs": 0,
536
+ "input": {
537
+ "properties": {
538
+ "post_id": {
539
+ "type": "string",
540
+ "description": "Exact t3_ Reddit post fullname",
541
+ "minLength": 4,
542
+ "maxLength": 40
543
+ }
544
+ },
545
+ "required": [
546
+ "post_id"
547
+ ]
548
+ },
549
+ "webSession": {
550
+ "site": "reddit",
551
+ "action": "media.read",
552
+ "contractVersion": 2,
553
+ "timeoutMs": 60000,
554
+ "maxOutputBytes": 4194304
555
+ }
556
+ },
557
+ "media.publish": {
558
+ "description": "Observed contract: publish one exact MP4 plus PNG/JPEG poster through captured old-Reddit cookie-authenticated leases bound to the current modhash, same-origin AJAX marker, and one permutation-safe exact thirteen-name S3 field set with media-type-specific fixed bucket declarations, cookie-free pinned S3 transfers, explicit post declarations, response-websocket target binding, and independent hosted-video readback.",
559
+ "risk": "R3",
560
+ "sideEffect": "Uploads one video and publishes one externally visible Reddit post in the exact confirmed community.",
561
+ "idempotency": "local-at-most-once",
562
+ "dedupeWindowMs": 86400000,
563
+ "input": {
564
+ "properties": {
565
+ "community": {
566
+ "type": "string",
567
+ "description": "Exact destination subreddit name",
568
+ "minLength": 2,
569
+ "maxLength": 21
570
+ },
571
+ "title": {
572
+ "type": "string",
573
+ "description": "Exact video-post title",
574
+ "minLength": 1,
575
+ "maxLength": 280
576
+ },
577
+ "body": {
578
+ "type": "string",
579
+ "description": "Optional exact video-post body",
580
+ "minLength": 1,
581
+ "maxLength": 10000
582
+ },
583
+ "media": {
584
+ "type": "file",
585
+ "description": "Exact plan-bound Reddit MP4",
586
+ "maxBytes": 536870912,
587
+ "mediaTypes": [
588
+ "video/mp4"
589
+ ]
590
+ },
591
+ "thumbnail": {
592
+ "type": "file",
593
+ "description": "Exact plan-bound PNG or JPEG poster for the native video",
594
+ "maxBytes": 20971520,
595
+ "mediaTypes": [
596
+ "image/jpeg",
597
+ "image/png"
598
+ ]
599
+ },
600
+ "nsfw": {
601
+ "type": "boolean",
602
+ "description": "Explicit adult-content declaration"
603
+ },
604
+ "spoiler": {
605
+ "type": "boolean",
606
+ "description": "Explicit spoiler declaration"
607
+ },
608
+ "send_replies": {
609
+ "type": "boolean",
610
+ "description": "Explicit reply-notification choice"
611
+ }
612
+ },
613
+ "required": [
614
+ "community",
615
+ "title",
616
+ "media",
617
+ "thumbnail",
618
+ "nsfw",
619
+ "spoiler",
620
+ "send_replies"
621
+ ]
622
+ },
623
+ "webSession": {
624
+ "site": "reddit",
625
+ "action": "media.publish",
626
+ "contractVersion": 9,
627
+ "timeoutMs": 600000,
628
+ "maxOutputBytes": 8388608
629
+ }
630
+ },
631
+ "comments.create": {
632
+ "description": "Capture-required contract reservation: publish one top-level Reddit comment only after an authorized actor/root-bound fixture is reviewed.",
633
+ "risk": "R3",
634
+ "sideEffect": "Publishes one externally visible comment on the exact confirmed Reddit post.",
635
+ "idempotency": "local-at-most-once",
636
+ "dedupeWindowMs": 86400000,
637
+ "input": {
638
+ "properties": {
639
+ "post_id": {
640
+ "type": "string",
641
+ "description": "Exact t3_ Reddit post fullname",
642
+ "minLength": 4,
643
+ "maxLength": 40
644
+ },
645
+ "body": {
646
+ "type": "string",
647
+ "description": "Exact comment body",
648
+ "minLength": 1,
649
+ "maxLength": 2000
650
+ }
651
+ },
652
+ "required": [
653
+ "post_id",
654
+ "body"
655
+ ]
656
+ },
657
+ "webSession": {
658
+ "site": "reddit",
659
+ "action": "comments.create",
660
+ "contractVersion": 1,
661
+ "timeoutMs": 60000,
662
+ "maxOutputBytes": 2097152
663
+ }
664
+ },
665
+ "replies.create": {
666
+ "description": "Capture-required contract reservation: publish one Reddit comment or legacy-message reply only after an authorized actor/root/parent-bound fixture is reviewed.",
667
+ "risk": "R3",
668
+ "sideEffect": "Publishes one externally visible reply to the exact confirmed Reddit parent.",
669
+ "idempotency": "local-at-most-once",
670
+ "dedupeWindowMs": 86400000,
671
+ "input": {
672
+ "properties": {
673
+ "parent_id": {
674
+ "type": "string",
675
+ "description": "Exact t1_ comment or t4_ legacy-message parent fullname",
676
+ "minLength": 4,
677
+ "maxLength": 40
678
+ },
679
+ "body": {
680
+ "type": "string",
681
+ "description": "Exact reply body",
682
+ "minLength": 1,
683
+ "maxLength": 2000
684
+ }
685
+ },
686
+ "required": [
687
+ "parent_id",
688
+ "body"
689
+ ]
690
+ },
691
+ "webSession": {
692
+ "site": "reddit",
693
+ "action": "replies.create",
694
+ "contractVersion": 1,
695
+ "timeoutMs": 60000,
696
+ "maxOutputBytes": 2097152
697
+ }
698
+ },
699
+ "content.edit": {
700
+ "description": "Capture-required contract reservation: edit one exact authored Reddit post or comment only after response and independent content readback are reviewed.",
701
+ "risk": "R3",
702
+ "sideEffect": "Edits the externally visible body of the exact confirmed authored Reddit post or comment.",
703
+ "idempotency": "local-at-most-once",
704
+ "dedupeWindowMs": 86400000,
705
+ "input": {
706
+ "properties": {
707
+ "thing_id": {
708
+ "type": "string",
709
+ "description": "Exact authored t1_ comment or t3_ post fullname",
710
+ "minLength": 4,
711
+ "maxLength": 40
712
+ },
713
+ "body": {
714
+ "type": "string",
715
+ "description": "Exact replacement body",
716
+ "minLength": 1,
717
+ "maxLength": 10000
718
+ }
719
+ },
720
+ "required": [
721
+ "thing_id",
722
+ "body"
723
+ ]
724
+ },
725
+ "webSession": {
726
+ "site": "reddit",
727
+ "action": "content.edit",
728
+ "contractVersion": 1,
729
+ "timeoutMs": 60000,
730
+ "maxOutputBytes": 2097152
731
+ }
732
+ },
733
+ "messaging.send": {
734
+ "description": "Capture-required contract reservation: send one legacy private message or Reddit Chat message only through its separately reviewed transport and recipient binding.",
735
+ "risk": "R3",
736
+ "sideEffect": "Sends one externally visible message to the exact confirmed Reddit recipient.",
737
+ "idempotency": "local-at-most-once",
738
+ "dedupeWindowMs": 86400000,
739
+ "input": {
740
+ "properties": {
741
+ "recipient": {
742
+ "type": "string",
743
+ "description": "Exact Reddit username",
744
+ "minLength": 1,
745
+ "maxLength": 64
746
+ },
747
+ "subject": {
748
+ "type": "string",
749
+ "description": "Exact legacy-message subject when applicable",
750
+ "minLength": 1,
751
+ "maxLength": 100
752
+ },
753
+ "body": {
754
+ "type": "string",
755
+ "description": "Exact message body",
756
+ "minLength": 1,
757
+ "maxLength": 1000
758
+ }
759
+ },
760
+ "required": [
761
+ "recipient",
762
+ "body"
763
+ ]
764
+ },
765
+ "webSession": {
766
+ "site": "reddit",
767
+ "action": "messaging.send",
768
+ "contractVersion": 1,
769
+ "timeoutMs": 60000,
770
+ "maxOutputBytes": 2097152
771
+ }
772
+ },
773
+ "posts.publish": {
774
+ "description": "Capture-required contract reservation: publish one Reddit self, link, image, or video post only after its exact submission and media workflow is reviewed.",
775
+ "risk": "R3",
776
+ "sideEffect": "Publishes one externally visible post in the exact confirmed Reddit community.",
777
+ "idempotency": "local-at-most-once",
778
+ "dedupeWindowMs": 86400000,
779
+ "input": {
780
+ "properties": {
781
+ "community": {
782
+ "type": "string",
783
+ "description": "Exact destination subreddit name",
784
+ "minLength": 1,
785
+ "maxLength": 64
786
+ },
787
+ "title": {
788
+ "type": "string",
789
+ "description": "Exact post title",
790
+ "minLength": 1,
791
+ "maxLength": 280
792
+ },
793
+ "body": {
794
+ "type": "string",
795
+ "description": "Exact self-post body",
796
+ "minLength": 1,
797
+ "maxLength": 10000
798
+ }
799
+ },
800
+ "required": [
801
+ "community",
802
+ "title"
803
+ ]
804
+ },
805
+ "webSession": {
806
+ "site": "reddit",
807
+ "action": "posts.publish",
808
+ "contractVersion": 1,
809
+ "timeoutMs": 60000,
810
+ "maxOutputBytes": 4194304
811
+ }
812
+ },
813
+ "posts.repost": {
814
+ "description": "Capture-required contract reservation: crosspost one exact Reddit post only after source, destination, actor, response, and independent readback are reviewed.",
815
+ "risk": "R3",
816
+ "sideEffect": "Publishes one externally visible crosspost in the exact confirmed Reddit community.",
817
+ "idempotency": "local-at-most-once",
818
+ "dedupeWindowMs": 86400000,
819
+ "input": {
820
+ "properties": {
821
+ "post_id": {
822
+ "type": "string",
823
+ "description": "Exact source t3_ Reddit post fullname",
824
+ "minLength": 4,
825
+ "maxLength": 40
826
+ },
827
+ "community": {
828
+ "type": "string",
829
+ "description": "Exact destination subreddit name",
830
+ "minLength": 1,
831
+ "maxLength": 64
832
+ },
833
+ "title": {
834
+ "type": "string",
835
+ "description": "Exact crosspost title",
836
+ "minLength": 1,
837
+ "maxLength": 280
838
+ }
839
+ },
840
+ "required": [
841
+ "post_id",
842
+ "community",
843
+ "title"
844
+ ]
845
+ },
846
+ "webSession": {
847
+ "site": "reddit",
848
+ "action": "posts.repost",
849
+ "contractVersion": 1,
850
+ "timeoutMs": 60000,
851
+ "maxOutputBytes": 4194304
852
+ }
853
+ }
854
+ }
855
+ }