@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,812 @@
1
+ {
2
+ "schemaVersion": 4,
3
+ "id": "substack-web",
4
+ "version": "1.1.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, and audio-item 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
+ "messaging.list": {
178
+ "description": "Observed contract: list one bounded Substack inbox tab without sending read acknowledgements, presence, or typing state.",
179
+ "risk": "R1",
180
+ "sideEffect": "none",
181
+ "idempotency": "none",
182
+ "dedupeWindowMs": 0,
183
+ "input": {
184
+ "properties": {
185
+ "folder": {
186
+ "type": "string",
187
+ "description": "Exact current Substack inbox tab",
188
+ "enum": [
189
+ "all",
190
+ "people",
191
+ "unread"
192
+ ]
193
+ },
194
+ "cursor": {
195
+ "type": "string",
196
+ "description": "Opaque cursor returned by the preceding inbox page",
197
+ "minLength": 1,
198
+ "maxLength": 4096
199
+ },
200
+ "limit": {
201
+ "type": "number",
202
+ "description": "Maximum inbox threads projected",
203
+ "minimum": 1,
204
+ "maximum": 100
205
+ }
206
+ },
207
+ "required": [
208
+ "folder"
209
+ ]
210
+ },
211
+ "webSession": {
212
+ "site": "substack",
213
+ "action": "messaging.list",
214
+ "contractVersion": 1,
215
+ "timeoutMs": 60000,
216
+ "maxOutputBytes": 8388608
217
+ }
218
+ },
219
+ "messaging.read": {
220
+ "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.",
221
+ "risk": "R1",
222
+ "sideEffect": "none",
223
+ "idempotency": "none",
224
+ "dedupeWindowMs": 0,
225
+ "input": {
226
+ "properties": {
227
+ "thread_id": {
228
+ "type": "string",
229
+ "description": "Exact opaque Substack thread ID returned by messaging.list",
230
+ "minLength": 1,
231
+ "maxLength": 512
232
+ }
233
+ },
234
+ "required": [
235
+ "thread_id"
236
+ ]
237
+ },
238
+ "webSession": {
239
+ "site": "substack",
240
+ "action": "messaging.read",
241
+ "contractVersion": 1,
242
+ "timeoutMs": 60000,
243
+ "maxOutputBytes": 8388608
244
+ }
245
+ },
246
+ "likes.set": {
247
+ "description": "Capture-required contract reservation: set one exact Substack post or Note/comment heart state after target-specific desired-state readback is proven.",
248
+ "risk": "R2",
249
+ "sideEffect": "Sets or clears the authenticated user's heart reaction on the exact confirmed Substack target.",
250
+ "idempotency": "local-at-most-once",
251
+ "dedupeWindowMs": 86400000,
252
+ "input": {
253
+ "properties": {
254
+ "target_type": {
255
+ "type": "string",
256
+ "description": "Target-specific reaction contract",
257
+ "enum": [
258
+ "article",
259
+ "note",
260
+ "comment"
261
+ ]
262
+ },
263
+ "target_id": {
264
+ "type": "number",
265
+ "description": "Exact positive target ID",
266
+ "minimum": 1,
267
+ "maximum": 9007199254740991
268
+ },
269
+ "liked": {
270
+ "type": "boolean",
271
+ "description": "Exact desired heart state"
272
+ }
273
+ },
274
+ "required": [
275
+ "target_type",
276
+ "target_id",
277
+ "liked"
278
+ ]
279
+ },
280
+ "webSession": {
281
+ "site": "substack",
282
+ "action": "likes.set",
283
+ "contractVersion": 1,
284
+ "timeoutMs": 60000,
285
+ "maxOutputBytes": 2097152
286
+ }
287
+ },
288
+ "content.save": {
289
+ "description": "Capture-required contract reservation: set one exact Substack article or Note saved state after target-specific independent readback is proven.",
290
+ "risk": "R2",
291
+ "sideEffect": "Saves or removes the exact confirmed Substack article or Note in the authenticated user's library.",
292
+ "idempotency": "local-at-most-once",
293
+ "dedupeWindowMs": 86400000,
294
+ "input": {
295
+ "properties": {
296
+ "target_type": {
297
+ "type": "string",
298
+ "description": "Target-specific save contract",
299
+ "enum": [
300
+ "article",
301
+ "note"
302
+ ]
303
+ },
304
+ "target_id": {
305
+ "type": "number",
306
+ "description": "Exact positive target ID",
307
+ "minimum": 1,
308
+ "maximum": 9007199254740991
309
+ },
310
+ "saved": {
311
+ "type": "boolean",
312
+ "description": "Exact desired saved state"
313
+ }
314
+ },
315
+ "required": [
316
+ "target_type",
317
+ "target_id",
318
+ "saved"
319
+ ]
320
+ },
321
+ "webSession": {
322
+ "site": "substack",
323
+ "action": "content.save",
324
+ "contractVersion": 1,
325
+ "timeoutMs": 60000,
326
+ "maxOutputBytes": 2097152
327
+ }
328
+ },
329
+ "relationships.follow.set": {
330
+ "description": "Capture-required contract reservation: set one exact free user-follow or publication-subscription state; paid, pledge, purchase, email, and access changes remain blocked.",
331
+ "risk": "R2",
332
+ "sideEffect": "Sets or clears one exact free Substack follow/subscription relationship without changing billing or email settings.",
333
+ "idempotency": "local-at-most-once",
334
+ "dedupeWindowMs": 86400000,
335
+ "input": {
336
+ "properties": {
337
+ "target_type": {
338
+ "type": "string",
339
+ "description": "Free relationship type",
340
+ "enum": [
341
+ "user",
342
+ "publication"
343
+ ]
344
+ },
345
+ "target_id": {
346
+ "type": "number",
347
+ "description": "Exact positive user or publication ID",
348
+ "minimum": 1,
349
+ "maximum": 9007199254740991
350
+ },
351
+ "following": {
352
+ "type": "boolean",
353
+ "description": "Exact desired free relationship state"
354
+ }
355
+ },
356
+ "required": [
357
+ "target_type",
358
+ "target_id",
359
+ "following"
360
+ ]
361
+ },
362
+ "webSession": {
363
+ "site": "substack",
364
+ "action": "relationships.follow.set",
365
+ "contractVersion": 1,
366
+ "timeoutMs": 60000,
367
+ "maxOutputBytes": 2097152
368
+ }
369
+ },
370
+ "messaging.send": {
371
+ "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.",
372
+ "risk": "R3",
373
+ "sideEffect": "Sends one externally visible direct message to the exact confirmed Substack recipient or thread.",
374
+ "idempotency": "local-at-most-once",
375
+ "dedupeWindowMs": 86400000,
376
+ "input": {
377
+ "properties": {
378
+ "target_type": {
379
+ "type": "string",
380
+ "description": "Send to an existing thread or start with one exact user",
381
+ "enum": [
382
+ "thread",
383
+ "user"
384
+ ]
385
+ },
386
+ "target_id": {
387
+ "type": "string",
388
+ "description": "Exact thread ID or decimal user ID selected by target_type",
389
+ "minLength": 1,
390
+ "maxLength": 512
391
+ },
392
+ "body": {
393
+ "type": "string",
394
+ "description": "Exact direct-message body",
395
+ "minLength": 1,
396
+ "maxLength": 1000
397
+ }
398
+ },
399
+ "required": [
400
+ "target_type",
401
+ "target_id",
402
+ "body"
403
+ ]
404
+ },
405
+ "webSession": {
406
+ "site": "substack",
407
+ "action": "messaging.send",
408
+ "contractVersion": 1,
409
+ "timeoutMs": 60000,
410
+ "maxOutputBytes": 2097152
411
+ }
412
+ },
413
+ "comments.create": {
414
+ "description": "Capture-required contract reservation: publish one confirmed top-level article comment after exact publication permissions and returned actor/post binding are reviewed.",
415
+ "risk": "R3",
416
+ "sideEffect": "Publishes one externally visible comment on the exact confirmed Substack article.",
417
+ "idempotency": "local-at-most-once",
418
+ "dedupeWindowMs": 86400000,
419
+ "input": {
420
+ "properties": {
421
+ "article_id": {
422
+ "type": "number",
423
+ "description": "Exact positive article ID",
424
+ "minimum": 1,
425
+ "maximum": 9007199254740991
426
+ },
427
+ "publication_id": {
428
+ "type": "number",
429
+ "description": "Exact publication ID independently bound to the article",
430
+ "minimum": 1,
431
+ "maximum": 9007199254740991
432
+ },
433
+ "body": {
434
+ "type": "string",
435
+ "description": "Exact comment body",
436
+ "minLength": 1,
437
+ "maxLength": 1000
438
+ }
439
+ },
440
+ "required": [
441
+ "article_id",
442
+ "publication_id",
443
+ "body"
444
+ ]
445
+ },
446
+ "webSession": {
447
+ "site": "substack",
448
+ "action": "comments.create",
449
+ "contractVersion": 1,
450
+ "timeoutMs": 60000,
451
+ "maxOutputBytes": 2097152
452
+ }
453
+ },
454
+ "replies.create": {
455
+ "description": "Capture-required contract reservation: publish one confirmed reply through an exact Note, article-comment, or chat reply contract.",
456
+ "risk": "R3",
457
+ "sideEffect": "Publishes one externally visible reply beneath the exact confirmed Substack parent.",
458
+ "idempotency": "local-at-most-once",
459
+ "dedupeWindowMs": 86400000,
460
+ "input": {
461
+ "properties": {
462
+ "parent_type": {
463
+ "type": "string",
464
+ "description": "Exact parent contract",
465
+ "enum": [
466
+ "note",
467
+ "comment",
468
+ "chat"
469
+ ]
470
+ },
471
+ "parent_id": {
472
+ "type": "string",
473
+ "description": "Exact parent entity or thread ID",
474
+ "minLength": 1,
475
+ "maxLength": 512
476
+ },
477
+ "body": {
478
+ "type": "string",
479
+ "description": "Exact reply body",
480
+ "minLength": 1,
481
+ "maxLength": 1000
482
+ }
483
+ },
484
+ "required": [
485
+ "parent_type",
486
+ "parent_id",
487
+ "body"
488
+ ]
489
+ },
490
+ "webSession": {
491
+ "site": "substack",
492
+ "action": "replies.create",
493
+ "contractVersion": 1,
494
+ "timeoutMs": 60000,
495
+ "maxOutputBytes": 2097152
496
+ }
497
+ },
498
+ "posts.publish": {
499
+ "description": "Observed contract: publish one confirmed Substack Note with an optional reviewed PNG after exact asset, actor, returned-entity, and independent readback binding.",
500
+ "risk": "R3",
501
+ "sideEffect": "Publishes one externally visible Substack Note with the exact confirmed text and optional media.",
502
+ "idempotency": "local-at-most-once",
503
+ "dedupeWindowMs": 86400000,
504
+ "input": {
505
+ "properties": {
506
+ "body": {
507
+ "type": "string",
508
+ "description": "Exact Note body",
509
+ "minLength": 1,
510
+ "maxLength": 500
511
+ },
512
+ "media": {
513
+ "type": "file",
514
+ "description": "Optional reviewed Note PNG",
515
+ "maxBytes": 20971520,
516
+ "mediaTypes": [
517
+ "image/png"
518
+ ]
519
+ }
520
+ },
521
+ "required": [
522
+ "body"
523
+ ]
524
+ },
525
+ "webSession": {
526
+ "site": "substack",
527
+ "action": "posts.publish",
528
+ "contractVersion": 2,
529
+ "timeoutMs": 600000,
530
+ "maxOutputBytes": 4194304
531
+ }
532
+ },
533
+ "posts.quote": {
534
+ "description": "Capture-required contract reservation: publish one confirmed quote-Note bound to an exact source Note, comment, or article.",
535
+ "risk": "R3",
536
+ "sideEffect": "Publishes one externally visible Substack quote-Note referencing the exact confirmed source.",
537
+ "idempotency": "local-at-most-once",
538
+ "dedupeWindowMs": 86400000,
539
+ "input": {
540
+ "properties": {
541
+ "source_type": {
542
+ "type": "string",
543
+ "description": "Exact quoted entity type",
544
+ "enum": [
545
+ "article",
546
+ "note",
547
+ "comment"
548
+ ]
549
+ },
550
+ "source_id": {
551
+ "type": "number",
552
+ "description": "Exact positive source entity ID",
553
+ "minimum": 1,
554
+ "maximum": 9007199254740991
555
+ },
556
+ "body": {
557
+ "type": "string",
558
+ "description": "Exact quote-Note body",
559
+ "minLength": 1,
560
+ "maxLength": 500
561
+ }
562
+ },
563
+ "required": [
564
+ "source_type",
565
+ "source_id",
566
+ "body"
567
+ ]
568
+ },
569
+ "webSession": {
570
+ "site": "substack",
571
+ "action": "posts.quote",
572
+ "contractVersion": 1,
573
+ "timeoutMs": 60000,
574
+ "maxOutputBytes": 2097152
575
+ }
576
+ },
577
+ "posts.repost": {
578
+ "description": "Capture-required contract reservation: restack one exact Substack article, Note, comment, or media clip only after the returned restack entity is response-bound.",
579
+ "risk": "R3",
580
+ "sideEffect": "Creates one externally visible Substack restack of the exact confirmed source.",
581
+ "idempotency": "local-at-most-once",
582
+ "dedupeWindowMs": 86400000,
583
+ "input": {
584
+ "properties": {
585
+ "source_type": {
586
+ "type": "string",
587
+ "description": "Exact restack source contract",
588
+ "enum": [
589
+ "article",
590
+ "note",
591
+ "comment",
592
+ "media"
593
+ ]
594
+ },
595
+ "source_id": {
596
+ "type": "number",
597
+ "description": "Exact positive source entity ID",
598
+ "minimum": 1,
599
+ "maximum": 9007199254740991
600
+ }
601
+ },
602
+ "required": [
603
+ "source_type",
604
+ "source_id"
605
+ ]
606
+ },
607
+ "webSession": {
608
+ "site": "substack",
609
+ "action": "posts.repost",
610
+ "contractVersion": 1,
611
+ "timeoutMs": 60000,
612
+ "maxOutputBytes": 2097152
613
+ }
614
+ },
615
+ "content.share": {
616
+ "description": "Capture-required contract reservation: share one exact Substack entity to one explicitly confirmed native or external destination after destination-specific effects are reviewed.",
617
+ "risk": "R3",
618
+ "sideEffect": "Shares the exact confirmed Substack entity to the exact confirmed destination.",
619
+ "idempotency": "local-at-most-once",
620
+ "dedupeWindowMs": 86400000,
621
+ "input": {
622
+ "properties": {
623
+ "target_type": {
624
+ "type": "string",
625
+ "description": "Exact source entity type",
626
+ "enum": [
627
+ "article",
628
+ "note",
629
+ "comment"
630
+ ]
631
+ },
632
+ "target_id": {
633
+ "type": "number",
634
+ "description": "Exact positive source entity ID",
635
+ "minimum": 1,
636
+ "maximum": 9007199254740991
637
+ },
638
+ "destination": {
639
+ "type": "string",
640
+ "description": "Exact share destination contract",
641
+ "enum": [
642
+ "substack",
643
+ "external"
644
+ ]
645
+ }
646
+ },
647
+ "required": [
648
+ "target_type",
649
+ "target_id",
650
+ "destination"
651
+ ]
652
+ },
653
+ "webSession": {
654
+ "site": "substack",
655
+ "action": "content.share",
656
+ "contractVersion": 1,
657
+ "timeoutMs": 60000,
658
+ "maxOutputBytes": 2097152
659
+ }
660
+ },
661
+ "content.edit": {
662
+ "description": "Capture-required contract reservation: edit one exact owned Substack Note, comment, draft, or article after actor ownership and independent readback are proven.",
663
+ "risk": "R3",
664
+ "sideEffect": "Changes externally visible or scheduled content owned by the authenticated Substack user.",
665
+ "idempotency": "local-at-most-once",
666
+ "dedupeWindowMs": 86400000,
667
+ "input": {
668
+ "properties": {
669
+ "target_type": {
670
+ "type": "string",
671
+ "description": "Exact owned-content edit contract",
672
+ "enum": [
673
+ "note",
674
+ "comment",
675
+ "draft",
676
+ "article"
677
+ ]
678
+ },
679
+ "target_id": {
680
+ "type": "number",
681
+ "description": "Exact positive owned entity ID",
682
+ "minimum": 1,
683
+ "maximum": 9007199254740991
684
+ },
685
+ "body": {
686
+ "type": "string",
687
+ "description": "Exact replacement body",
688
+ "minLength": 1,
689
+ "maxLength": 50000
690
+ }
691
+ },
692
+ "required": [
693
+ "target_type",
694
+ "target_id",
695
+ "body"
696
+ ]
697
+ },
698
+ "webSession": {
699
+ "site": "substack",
700
+ "action": "content.edit",
701
+ "contractVersion": 1,
702
+ "timeoutMs": 60000,
703
+ "maxOutputBytes": 4194304
704
+ }
705
+ },
706
+ "articles.publish": {
707
+ "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.",
708
+ "risk": "R3",
709
+ "sideEffect": "Publishes one externally visible article on the exact confirmed viewer-owned publication; no subscriber email is sent by default.",
710
+ "idempotency": "local-at-most-once",
711
+ "dedupeWindowMs": 86400000,
712
+ "input": {
713
+ "properties": {
714
+ "publication_id": {
715
+ "type": "number",
716
+ "description": "Exact viewer-owned publication ID resolved to its bound origin",
717
+ "minimum": 1,
718
+ "maximum": 9007199254740991
719
+ },
720
+ "title": {
721
+ "type": "string",
722
+ "description": "Exact article title",
723
+ "minLength": 1,
724
+ "maxLength": 160
725
+ },
726
+ "body": {
727
+ "type": "string",
728
+ "description": "Exact article body",
729
+ "minLength": 1,
730
+ "maxLength": 50000
731
+ },
732
+ "media": {
733
+ "type": "file",
734
+ "description": "Optional reviewed lead image, video, or audio attachment",
735
+ "maxBytes": 536870912,
736
+ "mediaTypes": [
737
+ "image/jpeg",
738
+ "image/png",
739
+ "image/gif",
740
+ "image/webp",
741
+ "video/mp4",
742
+ "video/quicktime",
743
+ "audio/mpeg",
744
+ "audio/mp4",
745
+ "audio/wav"
746
+ ]
747
+ }
748
+ },
749
+ "required": [
750
+ "publication_id",
751
+ "title",
752
+ "body"
753
+ ]
754
+ },
755
+ "webSession": {
756
+ "site": "substack",
757
+ "action": "articles.publish",
758
+ "contractVersion": 1,
759
+ "timeoutMs": 600000,
760
+ "maxOutputBytes": 4194304
761
+ }
762
+ },
763
+ "content.schedule": {
764
+ "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.",
765
+ "risk": "R3",
766
+ "sideEffect": "Schedules one externally visible article on the exact confirmed viewer-owned publication; no subscriber email is sent by default.",
767
+ "idempotency": "local-at-most-once",
768
+ "dedupeWindowMs": 86400000,
769
+ "input": {
770
+ "properties": {
771
+ "publication_id": {
772
+ "type": "number",
773
+ "description": "Exact viewer-owned publication ID resolved to its bound origin",
774
+ "minimum": 1,
775
+ "maximum": 9007199254740991
776
+ },
777
+ "title": {
778
+ "type": "string",
779
+ "description": "Exact article title",
780
+ "minLength": 1,
781
+ "maxLength": 160
782
+ },
783
+ "body": {
784
+ "type": "string",
785
+ "description": "Exact article body",
786
+ "minLength": 1,
787
+ "maxLength": 50000
788
+ },
789
+ "scheduled_at": {
790
+ "type": "string",
791
+ "description": "Exact ISO-8601 schedule time with explicit offset",
792
+ "minLength": 20,
793
+ "maxLength": 64
794
+ }
795
+ },
796
+ "required": [
797
+ "publication_id",
798
+ "title",
799
+ "body",
800
+ "scheduled_at"
801
+ ]
802
+ },
803
+ "webSession": {
804
+ "site": "substack",
805
+ "action": "content.schedule",
806
+ "contractVersion": 1,
807
+ "timeoutMs": 600000,
808
+ "maxOutputBytes": 4194304
809
+ }
810
+ }
811
+ }
812
+ }