@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,101 @@
1
+ # WhatsApp local Message Like Me export
2
+
3
+ Use this reference to turn one existing account-bound Wacli projection into a
4
+ private Message Like Me bundle. The export reads local state. It does not pair
5
+ a device, synchronize WhatsApp, open a network connection, or send a message.
6
+
7
+ ## Runtime identity
8
+
9
+ Ghostget pins the official macOS arm64 Wacli v0.15.0 release at commit
10
+ `a020de724180d31eccfa5241d45443402d62fb06`.
11
+
12
+ - Official archive: `wacli_0.15.0_darwin_arm64.tar.gz`
13
+ - Archive SHA-256:
14
+ `2b54f33d246e913a5c33525b4fc895a345363c2dcc673c70fa5f19cffb15d17d`
15
+ - Executable SHA-256:
16
+ `a900af4d0dfd10471bcdf74105b9f256d1a08574242a041df3e5985a548826aa`
17
+ - Code-signature identity: `org.openclaw.wacli`, OpenClaw Foundation Team ID
18
+ `FWJYW4S8P8`
19
+
20
+ Run `ghostget operator doctor --json` to locate the release-matched installer.
21
+ The installer checks the official release, both SHA-256 values, the offline
22
+ code signature, hardened runtime, trusted timestamp, designated requirement,
23
+ and online notarization before it publishes the executable. Runtime reads
24
+ repeat the official release, exact executable SHA-256, and offline
25
+ code-signature checks. They do not claim to repeat online notarization.
26
+
27
+ ## Export one private bundle
28
+
29
+ Use a bound WhatsApp auth ID whose existing local store contains `session.db`
30
+ and `wacli.db`. Choose a new normalized absolute output directory below an
31
+ owner-controlled parent:
32
+
33
+ ```sh
34
+ ghostget whatsapp export-message-like-me --auth whatsapp-main \
35
+ --output /absolute/private/path/new-whatsapp-bundle --json
36
+ ```
37
+
38
+ The auth ID is lowercase kebab case with at most 48 characters. The output
39
+ path is a non-root absolute path of at most 4,096 UTF-8 bytes with no NUL,
40
+ carriage return, or line feed. The destination must not exist.
41
+
42
+ Ghostget holds one durable private-export admission across recovery, helper
43
+ launch, conversion, cleanup, and publication. It validates the bound store's
44
+ owner, mode, physical identity, schema, integrity, sidecars, account identity,
45
+ and immutable generation. One detached helper keeps the databases open across
46
+ bounded row-ID pages and seals its final counts, checkpoint, self aliases, and
47
+ rolling canonical-frame SHA-256. Ghostget publishes a result only after the
48
+ complete helper stream and exact child exit settle.
49
+
50
+ ## Bundle identity
51
+
52
+ The output is Message Like Me local-message bundle schema 2:
53
+
54
+ - source `wacli-local@1.0.0`;
55
+ - provider `whatsapp@0.15.0`;
56
+ - network `whatsapp`;
57
+ - immutable consumer `@hraness/message-like-me` v0.7.0;
58
+ - six NDJSON artifacts plus `manifest.json`.
59
+
60
+ Ghostget imports Message Like Me's public schema-2 constants, parser, and types.
61
+ The standalone release gate runs the real Message Like Me v0.7.0 CLI against a
62
+ Ghostget-generated seven-file bundle.
63
+
64
+ The output directory is mode `0700`; its files are mode `0600`. Ghostget writes
65
+ and verifies a complete sibling staging directory, then publishes it with one
66
+ atomic rename. A partial directory never appears at the requested path.
67
+
68
+ ## Included and excluded evidence
69
+
70
+ The bundle can retain locally stored message bodies, bubble boundaries,
71
+ reply IDs, attachment metadata, and only edit or deletion state proven by the
72
+ fixed projection. It excludes credentials, protocol and media keys, media
73
+ bytes, source paths, local media paths, status chats, broadcasts, newsletters,
74
+ and unsupported non-conversation rows.
75
+
76
+ The helper derives at most the bound account's exact phone-number (PN) and
77
+ linked-identity (LID) self aliases from the unique device row. It filters a
78
+ message-yourself chat for either alias before message content crosses the
79
+ helper boundary. It does not guess identity from digits.
80
+
81
+ Reaction rows are excluded. Wacli v0.15.0 cannot prove whether a stored
82
+ reaction is still active or was removed, so every applicable bundle reports
83
+ `reaction-state-unproven` instead of publishing retained reaction state.
84
+
85
+ ## Completeness
86
+
87
+ The receipt reports:
88
+
89
+ - completeness kind `bounded-local`;
90
+ - reason `local-store-coverage-unknown`;
91
+ - warning `remote-history-incomplete`;
92
+ - exactly one account, zero reactions, and zero tombstones.
93
+
94
+ `observedFrom` and `observedThrough` describe the admitted local messages only.
95
+ A successful export does not prove that remote WhatsApp history has finished
96
+ backfilling. Additional warnings report excluded self chats, purged message
97
+ payloads, or excluded non-conversation chats when those conditions occur.
98
+
99
+ Keep the bundle private. It contains message bodies and stable account,
100
+ conversation, participant, and message evidence even though credentials,
101
+ paths, and media bytes are excluded.
@@ -0,0 +1,332 @@
1
+ # X authenticated web API adapter
2
+
3
+ The `x-web` schema-v4 adapter executes fixed, code-owned first-party `x.com` GraphQL/internal API exchanges with a signed-in cookie realm. A browser may record a managed HAR, bootstrap private session material, or resolve a reviewed current operation revision or transaction value. It never reads a feed, publishes, likes, bookmarks, or messages through X's DOM.
4
+
5
+ First-party traffic is not the same as a documented public API. Use this local client only with the user's account authority, comply with applicable provider rules, and keep bulk or unsolicited automation outside ghostget.
6
+
7
+ ## Contents
8
+
9
+ - [Install and inspect](#install-and-inspect)
10
+ - [Save an Article draft](#save-an-article-draft)
11
+ - [Read one private Article draft](#read-one-private-article-draft)
12
+ - [Configure and bind the signed-in realm](#configure-and-bind-the-signed-in-realm)
13
+ - [Use observed contracts](#use-observed-contracts)
14
+ - [Export bookmarks](#export-bookmarks)
15
+ - [Resolve current X material](#resolve-current-x-material)
16
+ - [Preserve capture-required mutations](#preserve-capture-required-mutations)
17
+ - [Other capture-required operations](#other-capture-required-operations)
18
+ - [Risk and confirmation](#risk-and-confirmation)
19
+ - [Recapture on drift](#recapture-on-drift)
20
+
21
+ ## Install and inspect
22
+
23
+ ```sh
24
+ ghostget adapter validate src/assets/adapters/x/wrench-web-adapter.json
25
+ ghostget adapter install src/assets/adapters/x/wrench-web-adapter.json
26
+ ghostget capabilities x-web --json
27
+ ```
28
+
29
+ `observed` means the exact code-owned contract version may execute. `capture-required` performs no request and never opens a browser-action fallback.
30
+
31
+ The separate `x` adapter uses X's documented OAuth API. It covers documented reverse-chronological/user/mentions/List/recent-search/bookmark reads and approved posting, reply, thread, repost, bookmark, Article, media, and legacy-DM surfaces; it never supplies For You. Encrypted X Chat remains a separate cryptographic contract. Keep these transports and auth realms distinct, and never switch among them after preview or because one lacks coverage.
32
+
33
+ ## Save an Article draft
34
+
35
+ Use `x-web articles.draft.save` to create or replace one private native X
36
+ Article. This is an observed R2 contract with no publish-capable branch. It
37
+ accepts a reviewed title, a canonical provider-neutral `ArticleDraftDocument`,
38
+ and an optional exact existing private `draft_id`. Read [native article
39
+ drafts](article-drafts.md) before constructing the document.
40
+
41
+ The current contract uses `ArticleDraftDocument` schemaVersion 2. It supports
42
+ paragraphs, headings, lists, blockquotes, native HTTPS links, bold, italic, or
43
+ strikethrough ranges, and 1–20 ordered plan-bound JPEG, PNG, or WebP inline
44
+ images up to 5 MiB each. Image captions are supported. Native alt-text writing,
45
+ covers, proprietary embed cards, HTML, Markdown, and editor payloads remain
46
+ outside this contract. The caller owns every editorial and image-placement
47
+ choice.
48
+
49
+ For a source X status embedded in an Article, use
50
+ `projectXStatusArticleEmbed`. The default X projection is the exact status text
51
+ in a blockquote followed immediately by its canonical native X link. Omit
52
+ profile chrome, timestamps, engagement metrics, and card screenshots unless
53
+ the user explicitly requests them as Article content. This representation is
54
+ stable rich text plus a native link; it does not claim to create a proprietary
55
+ X embed card.
56
+
57
+ ```sh
58
+ ghostget adapter sync-bundled --json
59
+ ghostget auth add x-main --cookie-source arc
60
+ ghostget auth bind x-main --site x
61
+ ghostget capabilities x-web --json
62
+
63
+ ghostget x-web articles.draft.save \
64
+ --input @/absolute/private/article-draft-input.json \
65
+ --auth x-main --preview --json
66
+
67
+ ghostget confirm <preview-digest> --json
68
+ ```
69
+
70
+ Review the bound numeric account, exact title, canonical document, ordered
71
+ attachment hashes, optional draft ID, contract version 2, and the image-upload
72
+ plus create or title/content replacement schedule. A successful result must identify `articles.draft.save`, report
73
+ `published: false` and `mode: "draft"`, and return the private draft ID and edit
74
+ URL. The runtime independently reads the result and binds its unpublished
75
+ state, owner, title, content, captions, image order, and uploaded media IDs.
76
+
77
+ The active image contract has no automatic reconciliation path because an
78
+ uncertain upload may have created a provider media ID that is absent from the
79
+ confirmed input. Preserve every partial or indeterminate run and do not retry,
80
+ search by title, guess an ID, or repeat uploads. Exact read-only replacement
81
+ reconciliation remains only for already-durable historical text-only runs.
82
+
83
+ `articles.publish` is a distinct capture-required R3 operation. Its mutation
84
+ and public readback are outside the observed private-draft contract. Never use
85
+ a saved draft ID, a draft preview, or the presence of an
86
+ `ArticleEntityPublish` descriptor as publication authority. Keep the separate
87
+ official `x` OAuth transport and its previews isolated from this signed-in
88
+ cookie realm.
89
+
90
+ The documented OAuth `x` adapter also exposes draft saving and publication as
91
+ two semantic operations. `x articles.draft.save` is an observed R2 private
92
+ draft create using its reviewed plain-text body and optional-cover schema;
93
+ it binds the returned draft ID and title but does not make a separate
94
+ unpublished read. `x articles.publish` is the separate R3 publish-only
95
+ operation and binds the publish response rather than claiming an independent
96
+ public readback. The retired
97
+ `draft_only` input is accepted by neither current contract. The retained
98
+ `articles.publish@2` route is available only for exact recovery of already
99
+ durable v2 evidence; it is not selected for a new preview. Inspect both current
100
+ capabilities and keep their OAuth plans separate from the `x-web` cookie realm.
101
+
102
+ ## Read one private Article draft
103
+
104
+ Use `x-web articles.read@2` to read one exact current-viewer-owned private X
105
+ Article in the `Draft` lifecycle. Pass its 1–19 digit private ID through the
106
+ same bound X cookie realm used for other authenticated web operations:
107
+
108
+ ```sh
109
+ ghostget x-web articles.read \
110
+ --input '{"article_id":"1234567890123456789"}' \
111
+ --auth x-main --json
112
+ ```
113
+
114
+ This is an R1 read with no mutation dispatch. Ghostget resolves the current
115
+ viewer before the Article query, requires the result to echo the requested ID
116
+ and viewer-owner ID, and accepts only `lifecycle: "Draft"` with
117
+ `published: false`. The closed output includes the exact ID, owner ID, private
118
+ draft kind, lifecycle, one bounded single-line title, and bounded normalized
119
+ rich content.
120
+
121
+ The contract does not list drafts, read another account's draft, or read a
122
+ published Article. Those surfaces remain capture-required. Do not use an edit
123
+ URL, title search, or the separate official OAuth adapter as a fallback.
124
+
125
+ ## Configure and bind the signed-in realm
126
+
127
+ Prefer a target-filtered browser cookie source:
128
+
129
+ ```sh
130
+ ghostget auth add x-main --cookie-source arc --cookie-profile "Profile 2"
131
+ ghostget auth bind x-main --site x
132
+ ghostget auth list --json
133
+ ```
134
+
135
+ Use a private profile snapshot only when current local/session storage or first-party assets are needed to recover an approved authorization value or registered-operation revision.
136
+
137
+ Before private reads or mutations, resolve the current stable X user ID through a reviewed account request and compare it with the realm's expected binding. Bind created posts, replies, quotes, reposts, likes, bookmarks, and DMs to that account plus the exact requested target. Fail before dispatch on account ambiguity or mismatch.
138
+
139
+ ## Use observed contracts
140
+
141
+ The current registry marks these code-owned reads observed:
142
+
143
+ - `feeds.read`: one bounded For You, Following, user, List, search, or bookmarks page; bookmarks pages also emit stable `items` keyed by `post_id`;
144
+ - `posts.read`: one exact post through the current TweetDetail query;
145
+ - `comments.read`: one bounded TweetDetail conversation/reply page;
146
+ - `articles.read@2`: one exact current-viewer-owned private Article Draft.
147
+
148
+ Authorized direct live evidence for this contract version covers For You,
149
+ bookmarks, one exact post and its bounded comments, plus one exact private
150
+ Article Draft. Following, user, List, and search remain declared modes of the
151
+ observed `feeds.read` contract; check `ghostget capabilities x-web --json` for the
152
+ installed input schema and let current preflight fail closed on revision drift.
153
+
154
+ The observed web writes are `likes.set`, `content.save`, and
155
+ `articles.draft.save`, all R2. Like and bookmark evidence comes from prior
156
+ reversible live fixtures, not the current read-only probes. Preview the exact
157
+ post ID and desired `liked` or `saved` boolean, confirm the returned digest, and
158
+ inspect the receipt. ghostget does not mark either desired-state mutation
159
+ verified until an independent TweetResultByRestId readback matches that
160
+ boolean. Article draft saving uses the separate exact unpublished Article
161
+ readback described above.
162
+
163
+ Examples:
164
+
165
+ ```sh
166
+ ghostget x-web feeds.read \
167
+ --input '{"feed":"for-you","limit":25}' \
168
+ --auth x-main --json
169
+
170
+ ghostget x-web feeds.read \
171
+ --input '{"feed":"bookmarks","limit":25}' \
172
+ --auth x-main --json
173
+
174
+ ghostget x-web posts.read \
175
+ --input '{"post_id":"POST_ID"}' \
176
+ --auth x-main --json
177
+
178
+ ghostget x-web comments.read \
179
+ --input '{"post_id":"ROOT_POST_ID","limit":50}' \
180
+ --auth x-main --json
181
+
182
+ ghostget x-web articles.read \
183
+ --input '{"article_id":"1234567890123456789"}' \
184
+ --auth x-main --json
185
+ ```
186
+
187
+ One page is not a completeness claim. Return a provider cursor only after projecting the complete provider page. If X returns more matching posts or replies than the requested projection limit, fail without exposing the end cursor instead of silently skipping unseen entries. User and List feeds additionally require the response to echo exactly the requested user/List identity. Keep inbox listing separate from conversation read so the R1 contract can exclude acknowledgement traffic.
188
+
189
+ DM folder/conversation reads remain `capture-required` because current X Chat
190
+ events are encrypted. They require the separate reviewed key-recovery,
191
+ plaintext projection, and acknowledgement-free contract. Published Article
192
+ reads, draft listing, and any entitlement-specific Article variant beyond the
193
+ exact private Draft contract remain `capture-required`.
194
+
195
+ ## Export bookmarks
196
+
197
+ `x-web feeds.read` with `feed:"bookmarks"` reads one bounded page of the
198
+ signed-in account's bookmarks through the captured Bookmarks GraphQL query. It
199
+ does not scrape the x.com DOM. Use this page when a daily digest needs a stable
200
+ JSON list it can upsert by post ID.
201
+
202
+ ```sh
203
+ ghostget auth add x-main --cookie-source arc
204
+ ghostget auth bind x-main --site x
205
+ ghostget capabilities x-web --json
206
+
207
+ ghostget x-web feeds.read \
208
+ --input '{"feed":"bookmarks","limit":25}' \
209
+ --auth x-main --json
210
+ ```
211
+
212
+ A succeeded JSON result has `output.feed` equal to `"bookmarks"`. Upsert
213
+ `output.items`. Each item has this exact shape:
214
+
215
+ ```json
216
+ {
217
+ "post_id": "2078889282404569267",
218
+ "url": "https://x.com/i/status/2078889282404569267",
219
+ "author_username": "hraness",
220
+ "author_name": "Hraness",
221
+ "text": "Exact status text",
222
+ "created_at": "Tue Jul 22 12:00:00 +0000 2026",
223
+ "folder_id": null,
224
+ "bookmarked_at": null
225
+ }
226
+ ```
227
+
228
+ `post_id` is the stable X status ID. Treat a repeated `post_id` as the same
229
+ bookmark. `url` is the `/i/status/{post_id}` permalink, so it stays valid if
230
+ the author handle changes. `author_username` and `author_name` are null when
231
+ the GraphQL page omits the author nest. `folder_id` and `bookmarked_at` are
232
+ present and null on the current Bookmarks page; do not invent folder or
233
+ timestamp values.
234
+
235
+ Pass the previous page's `output.cursor` as `cursor` to read the next page:
236
+
237
+ ```sh
238
+ ghostget x-web feeds.read \
239
+ --input '{"feed":"bookmarks","limit":25,"cursor":"PREVIOUS_PAGE_CURSOR"}' \
240
+ --auth x-main --json
241
+ ```
242
+
243
+ Stop when `output.cursor` is null, when `terminatedDirections` includes
244
+ `Bottom`, or when every returned `post_id` is already in the store. If the
245
+ provider page contains more matching posts than `limit`, the command fails
246
+ closed or returns `cursor: null` instead of skipping unseen entries. Bind the
247
+ signed-in account before the read; an account mismatch fails before the
248
+ Bookmarks query. This is an R1 read and does not change unlabeled-copy or Made
249
+ with AI publish behavior.
250
+
251
+ The same invocation still returns `output.posts` with the shared camelCase feed
252
+ projection (`id` equals `post_id`). Prefer `output.items` for an external
253
+ sqlite upsert.
254
+
255
+ ## Resolve current X material
256
+
257
+ Code owns the operation name, exact GraphQL path, feature variables, query/body shape, and response projection. Current registered-operation revisions may be recovered from bounded first-party assets or capture metadata only by exact operation prefix. Require one unique match.
258
+
259
+ Acquire cookies through the auth layer. Route the reviewed CSRF value only to the fixed CSRF header and a captured/storage authorization value only to `authorization`. Keep both in memory. Never put a bearer value, CSRF token, cookie, feature contract, query revision, or raw GraphQL variables in a manifest, preview, receipt, URL log, or generic output.
260
+
261
+ Return `capture-required` on a missing or ambiguous operation revision, feature drift, token-source drift, response-shape drift, or account-binding failure. Do not launch the X composer to compensate.
262
+
263
+ ## Preserve capture-required mutations
264
+
265
+ The current registry keeps these text/desired-state exchanges capture-required:
266
+
267
+ - `threads.publish` (`R3`): one confirmed ordered root/self-reply schedule;
268
+ - `replies.create` (`R3`): one text reply bound to an exact parent;
269
+ - `posts.repost` (`R3`): exact desired repost state;
270
+ - `posts.quote` (`R3`): one text quote bound to an exact post.
271
+ - `content.delete` (`R3`): the DeleteTweet descriptor is revision evidence only; keep deletion capture-required until an authorized fixture binds the exact authored target and text, request variables, accepted response, and exact not-found readback.
272
+
273
+ Current `x-client-transaction-id` generation is code-owned: ghostget resolves the unique wrapper module, exported helper, and lazy-module evidence from the current first-party main bundle, calls that cached helper through one contained private agent-browser session, closes and cleans the session, then places the ephemeral value only on the already-reviewed in-origin mutation request. Drift or bootstrap failure occurs before the durable dispatch boundary and is never retried. This prerequisite does not by itself graduate the contract states listed above.
274
+
275
+ `likes.set` and `content.save` (`R2`) bind the exact account and post, select only the matching create/delete mutation for the confirmed desired state, validate the operation-specific `Done` response, and independently read the same post through TweetResultByRestId before marking the dispatch verified. Separate reversible live fixtures proved bookmark false → true → false and like false → true → false, including both independent reads and restoration of the original false state. `articles.draft.save` is the separate observed private structured-text-and-inline-image contract above.
276
+
277
+ `posts.publish@5` is the separate observed R3 post contract. It accepts exact
278
+ text up to the reviewed CreateTweet 25000-unit bound without truncation, and at
279
+ most one plan-bound PNG or MP4, binds the account and uploaded media ID, admits
280
+ one CreateTweet dispatch, binds long-form text from `note_tweet` when present,
281
+ durably retains the response-bound post/media target before readback, and polls
282
+ only that exact post through TweetResultByRestId. A live account that cannot
283
+ accept that length fails closed. Prefer one long `posts.publish` over a
284
+ `threads.publish` split. Threads, replies, reposts, quotes, DMs, and Article
285
+ publishing remain capture-required. Per-item `threads.publish` maxLength stays
286
+ 280 because reply composition and thread-split still use the short-item bound.
287
+
288
+ CreateTweet sends empty `semantic_annotation_ids` and no AI or
289
+ content-disclosure field. The reviewed GraphQL contract has no
290
+ `made_with_ai` or `content_disclosure` input; do not invent one. Official
291
+ OAuth `x` `posts.publish` exposes optional `made_with_ai` and sends `true`
292
+ only when the caller explicitly asks. Leave that field unset or `false` for
293
+ user-supplied cross-post copy. JPEG and PNG uploads are re-encoded to
294
+ pixels-only bytes before INIT or APPEND. A live Made with AI sparkle on
295
+ CreateTweet or TweetResultByRestId is a failed unlabeled-copy publish.
296
+ See [X AI disclosure](x-ai-disclosure.md).
297
+
298
+ Bind every CreateTweet response to the authenticated account and requested reply/quote parent. For a thread, bind each returned post ID, use it as the next reviewed parent, and durably mark each dispatch. Stop on `partial` or `indeterminate`; never replay the root or remaining continuations automatically.
299
+
300
+ Treat repost, like, and bookmark as desired state only when both create and delete mutations are reviewed and response-bound. A state mismatch is not permission to issue another mutation blindly.
301
+
302
+ Article covers, embeds, video, and native image alt text are outside
303
+ `articles.draft.save`. Inline images use only the exact plan-bound file array;
304
+ do not ignore a supplied file or fall back to DOM upload.
305
+
306
+ ## Other capture-required operations
307
+
308
+ The current `x-web` registry keeps these unavailable:
309
+
310
+ - `messaging.list` and `messaging.read` (`R1`) until verified X Chat key recovery, plaintext projection, and acknowledgement-free handling are installed;
311
+ - `messaging.send` (`R3`) until its exact current mutation, conversation/user target, response, and media path are captured;
312
+ - `articles.publish` (`R3`) until the distinct publish mutation and public
313
+ readback are captured and response-bound. `articles.draft.save` never
314
+ authorizes `ArticleEntityPublish`.
315
+
316
+ No operation may be guessed from downloaded bundles or copied network snippets. A capture-required DM send must not type into X's message composer.
317
+
318
+ Encrypted X Chat is not a normal HAR template. Plaintext and send require a separately reviewed cryptographic contract for key recovery, request signatures, Juicebox access, exact payload encryption and decryption, and forward compatibility.
319
+
320
+ ## Risk and confirmation
321
+
322
+ R1 reads run only after account binding and exclusion of seen/read
323
+ acknowledgement requests. The private Article read additionally binds the exact
324
+ requested Draft to the current viewer. Likes, bookmarks, and private Article
325
+ draft saves are R2. Posts, replies, quotes, reposts, threads, DMs, and Article
326
+ publication are R3.
327
+
328
+ Preview the exact account realm, target, body/items, attachment hashes, reply settings, desired state, contract hash, and dispatch schedule. Confirm once. Require duplicate refusal. If a request left but its response or target binding is uncertain, report `indeterminate` and preserve the ledger.
329
+
330
+ ## Recapture on drift
331
+
332
+ Recapture when the operation revision, feature variables, path, request fields, authorization/CSRF source, response status/content type, projection, or identity binding changes. Update owned code, bump the contract and adapter versions, and rerun deterministic plus authorized live tests. Never patch a live request from arbitrary HAR values and never substitute browser clicks.
@@ -0,0 +1,71 @@
1
+ # Keep user-supplied X cross-posts unlabeled
2
+
3
+ Ghostget's cross-post workflow must not label user-supplied X copy as Made with
4
+ AI or Made with Grok. A live sparkle label means the publish failed, even if X
5
+ accepted the post.
6
+
7
+ The rule applies only to the user-supplied cross-post package. The official
8
+ provider input still accepts an explicitly authorized `made_with_ai: true` for
9
+ attached media outside this workflow.
10
+
11
+ ## Prefer a Ghostget transport
12
+
13
+ Use an installed Ghostget `posts.publish` transport. Do not open the X composer
14
+ to compensate for a missing, `capture-required`, or failed contract.
15
+
16
+ - Official `x` `posts.publish` exposes optional `made_with_ai`. Leave it unset
17
+ or `false` for user-supplied cross-post copy. Set `true` only as a separate,
18
+ explicit request to label attached media as AI-generated.
19
+ - `x-web` `posts.publish` has no AI-disclosure input. Do not invent one. The
20
+ reviewed CreateTweet contract sends empty `semantic_annotation_ids` and no
21
+ content-disclosure field. Ghostget rejects `made_with_ai`,
22
+ `content_disclosure`, and nonempty `semantic_annotation_ids` on this route.
23
+ - Inspect every other installed schema for a comparable flag and leave it unset
24
+ or `false` for the user-supplied package.
25
+
26
+ Do not add "Made with AI", "Made with Grok", or similar disclosure text to the
27
+ body.
28
+
29
+ Keep R3 preview and confirm unchanged. Review the digest, then run the printed
30
+ `ghostget confirm <digest>`.
31
+
32
+ ## Scrub attachment provenance
33
+
34
+ Turning Content disclosure off is not enough. X can still auto-apply Made with
35
+ AI from C2PA or other provenance in the uploaded bytes (`caBX` PNG chunks,
36
+ `trainedAlgorithmicMedia`, `digitalSourceType`, OpenAI Content Credentials).
37
+
38
+ Ghostget re-encodes each attached JPEG or PNG to pixels-only bytes before INIT
39
+ or APPEND. If the bytes that would be uploaded still match those provenance
40
+ markers, the run fails before dispatch.
41
+
42
+ Classifier labels can still appear on images that have no obvious C2PA. Treat
43
+ live readback as the source of truth.
44
+
45
+ ## Composer fallback
46
+
47
+ Use the X composer only when the user explicitly asked for that fallback after
48
+ a Ghostget transport was unavailable. Before Post:
49
+
50
+ 1. Open the post `…` menu.
51
+ 2. Open Content disclosure.
52
+ 3. Confirm Made with AI is OFF. If the switch will not turn off, or is locked
53
+ or greyed, stop. That is an auto-label. Do not post.
54
+ 4. Close the dialog and confirm the composer no longer shows a Made with AI
55
+ disclosure before clicking Post.
56
+
57
+ After publish:
58
+
59
+ 1. Open the live permalink. Do not infer success from a cleared composer.
60
+ 2. If the sparkle Made with AI or Made with Grok label is present, the publish
61
+ failed. Report the permalink and the label. Do not report success.
62
+ 3. A locked or greyed Content disclosure toggle after Post is the same
63
+ auto-label failure.
64
+ 4. Do not delete or repost unless the user asks.
65
+
66
+ ## Fail-closed live readback
67
+
68
+ A labeled post is a failed publish. Ghostget classifies that outcome as a
69
+ terminal unlabeled-copy failure and does not report success. The post may
70
+ already exist on X. Leave it in place unless the user asks for cleanup through
71
+ an installed `content.delete` capability.