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