@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,496 @@
1
+ # Provider plugins
2
+
3
+ Use a provider plugin when a reviewed official API, first-party web API,
4
+ linked-device protocol, or exact provider CLI needs provider-specific contracts
5
+ and execution. Ghostget has two distributions over one logical registry:
6
+
7
+ - a source plugin is reviewed repository code statically assembled into Ghostget;
8
+ - a portable plugin is a self-contained immutable package that Ghostget verifies,
9
+ explicitly trusts, and runs through a bounded child-process protocol.
10
+
11
+ Neither kind is an installed adapter manifest. Source-plugin adapters remain
12
+ parsed local selectors. An enabled portable plugin owns virtual manifests that
13
+ the kernel projects from its verified package.
14
+
15
+ ## Inspect the registry
16
+
17
+ Ghostget uses the `ghostget` command:
18
+
19
+ ```sh
20
+ ghostget plugin list
21
+ ghostget plugin list --json
22
+ ghostget plugin show <plugin-id>
23
+ ghostget plugin show <plugin-id> --json
24
+ ```
25
+
26
+ The plural `plugins` command is an alias over the same registry:
27
+
28
+ ```sh
29
+ ghostget plugins list --json
30
+ ghostget plugins show <plugin-id> --json
31
+ ```
32
+
33
+ Use `plugin list` to discover source code available in the current Ghostget build and
34
+ portable packages enabled in the current `GHOSTGET_STATE_HOME`. Use `plugin show` to
35
+ inspect one plugin's version, source kind, immutable identity or implementation
36
+ files, transport bindings, exact surfaces and origins, auth kinds, capability
37
+ ceiling, subject format, and versioned semantic operations.
38
+
39
+ `ghostget capabilities` answers a different question. It reports executable or
40
+ `capture-required` adapter operations for the current `GHOSTGET_STATE_HOME`: stored data
41
+ manifests resolved through source plugins plus virtual manifests owned by
42
+ enabled portable plugins. A source plugin can exist without a corresponding
43
+ stored manifest.
44
+
45
+ Commands that interpret provider ownership or protected origins use the same
46
+ active registry: capability and doctor reports, adapter validation and
47
+ installation, derivation, auth binding, invocation, confirmation, and
48
+ reconciliation cannot disagree about an enabled portable plugin.
49
+
50
+ ## Treat source plugins as trusted code
51
+
52
+ Source plugins run in Ghostget's Bun process. They have the operating-system
53
+ authority of that process. TypeScript types, registry validation, and a
54
+ `capture-required` contract constrain how the kernel calls a plugin; they do
55
+ not isolate the plugin from the filesystem, network, environment, or process.
56
+ Review plugin code and every owned implementation file as trusted executable
57
+ code.
58
+
59
+ When `plugin.ts` defines a source plugin, Ghostget snapshots every eagerly imported
60
+ repository module and every exact installed package tree that could have
61
+ contributed a planner, validator, subject matcher, or other function object to
62
+ the descriptor. Registry startup must rediscover the same closure and bytes.
63
+ This prevents an old evaluated function from being published under a hash of
64
+ new source.
65
+
66
+ The registry separately snapshots each plugin's complete lazy runtime
67
+ implementation and dependency identity. Immediately before and after the first
68
+ runtime import, Ghostget rereads only that owning closure and rejects drift; restart
69
+ Ghostget after changing source files. These checks protect normal
70
+ upgrade/replacement workflows and prevent a changed runtime from reaching an
71
+ operation. They are not an atomic sandbox against a same-account writer racing
72
+ the module loader: changed top-level module code could run before the
73
+ post-import check rejects.
74
+
75
+ Treat built-in durable contract identity as the final semantic review step,
76
+ never an iteration mechanism. Finish provider code, manifests, deterministic
77
+ tests, documentation, and formatting before changing a semantic-identity
78
+ digest. Then run the focused contract test once to obtain the exact new digest,
79
+ review and record it, and run registry startup once more. Ghostget derives the
80
+ current source/dependency closure automatically, snapshots it at registry
81
+ startup, and revalidates it before and after lazy runtime load. It deliberately
82
+ has no manual closure allowlist or source-hash approval step.
83
+
84
+ Bare package imports are bound to their exact relocation-stable dependency
85
+ graph, not the repository's whole lockfile. Ghostget snapshots each installed package
86
+ with bounded full-tree walks around its byte reads, hashes the exact paths and
87
+ bytes, records required, optional, peer, and statically imported resolution
88
+ edges, and revalidates shared startup snapshots before the registry becomes
89
+ usable. Unrelated lockfile edits therefore do not invalidate a plugin, while an
90
+ entrypoint, undeclared hoisted import, optional dependency, duplicate physical
91
+ package occurrence, or package byte change does. Source-plugin package code
92
+ must use literal `import()` and `require()` targets so that executable closure
93
+ is knowable; an explicitly reviewed built-in exception is code-owned and
94
+ identity-bound. Agent-authored code that needs dynamic loading belongs in one
95
+ self-contained portable package instead of weakening this boundary.
96
+
97
+ Source identity also binds the Bun version, `NODE_ENV`, repository package
98
+ module semantics, safe `bunfig.toml`, the complete `tsconfig` extends chain,
99
+ and the nearest package scope for JavaScript. Ghostget must start from the checked
100
+ repository root and refuses ambient loader, preload, condition, transform,
101
+ working-directory, and tsconfig overrides. Repository modules may use
102
+ JavaScript or TypeScript module extensions plus imported JSON or TOML data.
103
+ JSX, TSX, custom loaders, URL imports, and computed module targets are rejected
104
+ because their executable closure depends on configuration or cannot be known
105
+ statically.
106
+
107
+ `plugin check` reads a bounded fixed file set, parses its data, and syntax-checks
108
+ TypeScript without importing the plugin. It proves scaffold shape and
109
+ fail-closed reservation state. It does not make later plugin execution safe or
110
+ establish that the implementation is trustworthy.
111
+
112
+ `adapter install` installs a parsed data manifest only. Do not present it as a
113
+ code-plugin installer. Ghostget never imports portable JavaScript into its process,
114
+ executes an authoring directory, runs package lifecycle scripts, or resolves
115
+ dependencies from ancestor `node_modules`.
116
+
117
+ ## Author and trust a portable plugin
118
+
119
+ Create the smallest inert package that reserves one semantic operation:
120
+
121
+ ```sh
122
+ ghostget plugin init example-web \
123
+ --display-name "Example" \
124
+ --surface example \
125
+ --origin https://www.example.com \
126
+ --operation feeds.read \
127
+ --output /absolute/private/example-web
128
+ ```
129
+
130
+ The generated package contains:
131
+
132
+ - `ghostget-plugin.json`, the strict identity, runtime, file inventory, capability
133
+ ceiling, bindings, subject contract, and semantic operations;
134
+ - `dist/plugin.mjs`, one self-contained Bun child-process runtime;
135
+ - `fixtures/*.json`, bounded secret-free deterministic invocations;
136
+ - `AGENTS.md`, package-local authoring and protocol guidance.
137
+
138
+ It starts `capture-required` and network-inert. An agent may implement it
139
+ without editing Ghostget, but must still prove the same origin, current-account,
140
+ request, response, target, side-effect, uncertainty, and drift facts required
141
+ for a source plugin. Then verify the fixed package boundary:
142
+
143
+ ```sh
144
+ ghostget plugin check /absolute/private/example-web --json
145
+ ghostget plugin test /absolute/private/example-web --trust-code --json
146
+ ghostget plugin pack /absolute/private/example-web \
147
+ --output /absolute/private/example-web.wrenchplugin --json
148
+ ghostget plugin install /absolute/private/example-web.wrenchplugin \
149
+ --trust-code --json
150
+ ```
151
+
152
+ `check` parses only a bounded canonical file tree without executing package
153
+ code and rejects symbolic links,
154
+ special files, native code, package-manager state, shells, dynamic module
155
+ loading, undeclared files, duplicate current contracts, and authority outside
156
+ the declared ceiling. `test --trust-code` binds the explicit execution
157
+ decision to the exact verified plugin ID, semantic version, and bundle digest
158
+ before running declared secret-free fixtures; its child process is not a
159
+ hostile-code sandbox. `pack` publishes verified bytes into a new empty package
160
+ directory. `install
161
+ --trust-code` records an explicit decision for the exact plugin ID, semantic
162
+ version, manifest hash, and bundle hash before enabling it.
163
+
164
+ Verification is an object-capability boundary, not a structural TypeScript
165
+ claim. The catalog accepts only the exact deeply frozen package value returned
166
+ by the verifier; a copied object with plausible digests is not verified.
167
+ Generic source-registry construction rejects portable projections. The
168
+ portable catalog alone asks the kernel runtime builder for child-host wrappers,
169
+ freezes each binding, operation descriptor, and runtime-hook container before
170
+ recording its package authority, projects virtual manifests, and then extends
171
+ an already validated source-only registry. No API can authorize
172
+ caller-supplied in-process hooks as portable package code.
173
+
174
+ The host starts the verified artifact with a minimal environment and exact
175
+ protocol, input, output, deadline, and frame bounds. Portable code receives
176
+ opaque handles rather than raw auth locators or arbitrary paths. Its optional
177
+ authorities are:
178
+
179
+ - exact-origin, DNS/IP-pinned HTTPS with no credential-bearing redirects;
180
+ - declared cookie or OAuth material usable only through its matching request
181
+ sink;
182
+ - exact size- and SHA-bound plan-file reads;
183
+ - bundle-, adapter-, auth-, and key-namespaced state;
184
+ - bounded redacted logging;
185
+ - one kernel-bracketed dispatch begin/request/verify sequence for mutations.
186
+
187
+ Resource owners register teardown before they start. After an operation
188
+ terminalizes, Ghostget gives the complete cleanup join one separate 30-second bound.
189
+ A still-pending or rejected barrier becomes cleanup-unsafe, rejects the
190
+ kernel-visible barrier, and preserves a durable retry fence rather than
191
+ silently authorizing another run. Portable plugins retain an invocation lease
192
+ that blocks the same plugin even if its bundle is replaced. Built-in and source
193
+ authenticated-web plugins retain an auth-realm admission keyed by the exact
194
+ surface and auth locator; registration durably marks the realm resource-active
195
+ before the resource starts. Same-boot cleanup-unsafe state is fail-closed and
196
+ visible in `ghostget operator doctor`. The browser publishes an exact prepared
197
+ root generation before profile effects, then durably records launch intent and
198
+ an immutable live control pin. Same-boot recovery first leases the exact claim,
199
+ then binds the private session to its daemon start identity, socket, engine,
200
+ launch hash, and CDP endpoint before graceful close or a bounded TERM. It
201
+ records quiescence only after the pinned owner is dead, the session is inactive,
202
+ and CDP refuses three times. Root deletion is then journaled one exact target at
203
+ a time; an already-absent root is accepted only from that durable quiescent
204
+ phase, while any replacement fails closed. Every remaining root must still
205
+ match its device, inode, birth time, owner, and private mode. Live or changed
206
+ owners, missing publication, unknown liveness, changed roots, and generic
207
+ cleanup failures remain fenced. Legacy claims may be adopted only while their
208
+ exact private session is live and bindable; dead legacy claims remain retained. Run
209
+ `ghostget operator doctor` until it reports either repaired state or a bounded
210
+ retention category before retrying. Never edit or delete a durable claim to
211
+ bypass this recovery boundary.
212
+
213
+ All other capabilities are denied. Process isolation contains ordinary crashes
214
+ and dependency mistakes; it is not a hostile-code sandbox for deliberately
215
+ malicious code running under the same OS account.
216
+
217
+ Portable v1 may describe a `linked-device` binding only as a network-inert
218
+ `capture-required` reservation. Observed linked-device operations, pairing,
219
+ and sync remain source-plugin-only until a portable lifecycle protocol can
220
+ preserve the same admission, journal, acknowledgement, and recovery
221
+ invariants. Ghostget rejects that execution path without transport fallback.
222
+ Portable v1 also rejects `local-cli`: verified native executable discovery,
223
+ process authority, and subprocess cleanup remain source-plugin-only.
224
+
225
+ Every installed `messaging.list` and `messaging.read` operation also declares
226
+ its omni state. Use `unsupported` with a concrete bounded reason unless exact
227
+ provider output semantics justify a source-owned materializer. A supported
228
+ materializer is pure, versioned, included in the plugin's reviewed
229
+ implementation closure, and returns only the strict shared page envelope. It
230
+ must reject unknown or changed provider fields at a bounded provider-owned
231
+ structural boundary without echoing unreviewed foreign names or values through
232
+ public status. It must state identity, page membership, completeness,
233
+ continuation, and tombstone semantics without inventing cross-provider
234
+ equivalence. The kernel reparses its return value from `unknown`. Omni v1 has
235
+ no provider-authored write-invalidation
236
+ tags. Auth-incarnation, materializer, and plugin implementation identity changes
237
+ strand prior normalized coordinates. Exact-query freshness advances only
238
+ through explicit revalidation, while materializer drift keeps the last good
239
+ derivative with an explicit categorical status. Its detailed provider-local
240
+ diagnostic remains encrypted. Portable v1 messaging remains explicitly
241
+ unsupported until the package protocol can attest the same output and
242
+ materializer closure.
243
+
244
+ Source linked-device pair, sync, auth replacement, auth removal, and explicit
245
+ reconciliation serialize on a realm derived from the provider plus canonical
246
+ physical store path, not the mutable auth ID. Consequently two auth aliases or
247
+ symlink spellings cannot bypass one another. After a post-boundary crash,
248
+ `ghostget runs reconcile <journal-id> --input <json>` accepts only an explicit
249
+ `applied` or `not-applied` observation with a SHA-256 evidence digest; it never
250
+ calls the lifecycle provider or retries the original effect.
251
+
252
+ An unsettled portable R2/R3 operation uses the same explicit observation
253
+ shape:
254
+
255
+ ```json
256
+ {"outcome":"applied","evidenceHash":"<sha256>"}
257
+ ```
258
+
259
+ Before cleanup, Ghostget binds that observation to the immutable receipt, bundle,
260
+ manifest, descriptor, auth, input, plan, and encrypted recovery capsule and
261
+ publishes a create-once resolution record. Repeating the exact observation is
262
+ idempotent; a different outcome or evidence digest is rejected. `applied`
263
+ retains the at-most-once ledger. Only `not-applied` releases the ledger for a
264
+ new, separately previewed and confirmed attempt, and only when the journal has
265
+ no verified dispatch. A verified dispatch permanently retains the fence even
266
+ if later plugin work became indeterminate. This reconciliation path does not
267
+ start portable code, call a provider, mutate the receipt, or retry a dispatch.
268
+
269
+ Every operation resolves to an exact immutable identity: plugin ID and
270
+ version, host API version, bundle and manifest SHA-256, adapter, transport,
271
+ surface, operation, contract version, and descriptor SHA-256. Ghostget retains that
272
+ identity in plans, receipts, run journals, and encrypted recovery capsules.
273
+ Live R1 work also owns an exact process-bound invocation lease.
274
+
275
+ Updates are compare-and-swap operations:
276
+
277
+ ```sh
278
+ ghostget plugin install /absolute/private/example-web-v2.wrenchplugin \
279
+ --trust-code --expected-current <old-bundle-sha256>
280
+ ghostget plugin disable example-web --expected-current <bundle-sha256>
281
+ ghostget plugin remove example-web --expected-current <bundle-sha256> --yes
282
+ ```
283
+
284
+ The catalog lock serializes portable activation, adapter installation,
285
+ invocation leases, and confirmation-plan publication. Ghostget refuses update,
286
+ disable, or removal while the exact old bundle owns a live/unknown invocation,
287
+ preview, claim, nonterminal or unreconciled run, recovery capsule, or
288
+ linked-device lifecycle. Invalid or unexpected durable state also blocks.
289
+ `remove` deletes activation only; immutable artifact and trust evidence remain
290
+ available for audit and historical recovery.
291
+
292
+ Each command observes one validated catalog snapshot. Adapter synchronization
293
+ records the installed-plugin fingerprint used to derive its candidate
294
+ generation and rechecks that fingerprint while holding the publication lock;
295
+ a concurrent plugin activation cannot publish adapters for a mixed catalog.
296
+
297
+ ## Preserve the kernel boundary
298
+
299
+ The kernel owns authority policy and durable state:
300
+
301
+ - auth selection, locator loading, and credential-scope validation;
302
+ - attachment resolution and content-bound asset bundles;
303
+ - risk enforcement, exact preview, digest confirmation, and R4 refusal;
304
+ - dispatch scheduling, journaling, at-most-once state, recovery, and receipts;
305
+ - output bounds, terminal sanitization, and redaction.
306
+
307
+ A plugin owns provider-specific meaning:
308
+
309
+ - plugin identity, exact transport, surface, runtime endpoint, manifest-origin,
310
+ and protected-hostname-family ownership;
311
+ - semantic operation contracts, input refinements, and subject format;
312
+ - current-account probing and account, actor, and target checks;
313
+ - deterministic dispatch planning, execution, and optional reconciliation;
314
+ - the complete implementation-source list used for its code identity.
315
+
316
+ The trusted source-plugin v1 contexts retain compatibility with existing
317
+ runtimes: an official-provider executor can receive its selected auth locator,
318
+ loaded token material, bounded HTTP client, and resolver-produced local file
319
+ paths; web and linked-device runtimes receive their corresponding scoped
320
+ context; a local CLI runtime receives the same bounded dispatch lifecycle but
321
+ owns exact executable and subprocess validation. This does not attenuate the
322
+ process's authority or isolate secrets from plugin code. Keep additions
323
+ transport-specific and narrowly typed; do not add arbitrary requests, argv, or
324
+ unrelated kernel objects. The portable
325
+ out-of-process host replaces these values with opaque, bounded host
326
+ capabilities. Never fall back between official API, web-session API,
327
+ linked-device protocol, local CLI, and browser behavior.
328
+
329
+ ## Define one binding
330
+
331
+ Every plugin definition is validated and deeply frozen. Its top level declares
332
+ `apiVersion: 1`, a strict kebab-case `id`, semantic `version`, `displayName`,
333
+ `sourceKind`, owned implementation sources, and at least one binding.
334
+
335
+ Each binding declares:
336
+
337
+ - one `provider-api`, `web-session-api`, `linked-device`, or `local-cli`
338
+ transport;
339
+ - a strict kebab-case `surfaceId`;
340
+ - the exact code-owned runtime `origin`;
341
+ - exact `manifestOrigins` when the public product origin differs from the
342
+ runtime endpoint;
343
+ - `protectedHostnameFamilies` that reserve the provider's signed-in hostname
344
+ family from generic browser and reviewed-template adapters;
345
+ - accepted auth kinds and one stable, namespaced subject matcher;
346
+ - one or more versioned semantic operations;
347
+ - a lazy runtime loader. Import provider execution code only inside that
348
+ loader.
349
+
350
+ A `local-cli` binding additionally declares one strict tool identity. It names
351
+ the upstream version under an explicit `semver` or `opaque` scheme and pins the
352
+ final executable SHA-256 for every supported platform and architecture. Bind
353
+ published source, release-commit, release-manifest, archive, and download
354
+ provenance too; an archive or manifest URL and digest are an all-or-nothing
355
+ pair. The operation's semantic contract and the tool's byte identity are
356
+ separate version boundaries, but both enter durable implementation identity.
357
+ When the executable speaks a separately versioned provider API, include the
358
+ reviewed API schema or SDK revision in the operation implementation identity;
359
+ an executable digest cannot prove that an independently updated server kept
360
+ the same semantics.
361
+
362
+ An operation declares its active `contractVersion`, any structurally compatible
363
+ `historicalContractVersions`, exact risk, bounded input schema, side effect,
364
+ idempotency and dedupe policy, observed or capture-required state, dispatch
365
+ shape, deterministic planner, and input validator. Optional hooks may bind an
366
+ input actor to the auth subject or declare boolean desired-state
367
+ reconciliation. A linked-device binding can additionally declare inspect,
368
+ pair, and one-shot sync lifecycle support.
369
+
370
+ `manifestOrigins` and `protectedHostnameFamilies` are different. The first is
371
+ the exact public origin set durable manifests must carry for current execution.
372
+ The second is a hostname-suffix reservation that also protects sibling API and
373
+ asset hosts. For example, a runtime at `api.example.com` and public product at
374
+ `www.example.com` normally reserve `example.com`. Avoid an overbroad public
375
+ suffix such as `co.uk`.
376
+
377
+ ## Wrap one exact provider CLI
378
+
379
+ Use `local-cli` only when an official native client is the reviewed transport.
380
+ Keep its interface semantic: one operation owns one fixed command template,
381
+ strict inputs, strict projected output, exact account and target probes,
382
+ deadlines, byte limits, and failure categories. Maintain a deterministic
383
+ coverage ledger that maps every reviewed upstream canonical command to one
384
+ semantic operation or one explicit unavailable reason. Never expose a generic
385
+ command name, argument array, environment override, endpoint, or output path.
386
+
387
+ Resolve and hash the final executable before private work. Start it directly
388
+ without a shell under a minimal environment and operation-private config,
389
+ data, cache, and temporary roots. Strip ambient credentials, targets, account
390
+ defaults, proxies, debug flags, and plugin search state. If the CLI supports
391
+ user, linked, or just-in-time plugins, isolate or reject them so unbound code
392
+ cannot override a reviewed command.
393
+
394
+ Use exact provider IDs instead of titles, fuzzy lookup, interactive selection,
395
+ or ambient defaults. Stage an attachment only from the kernel's digest-bound
396
+ plan asset. Parse stdout and stderr from `unknown`, reject extra fields and
397
+ changed envelopes, and never persist argv or foreign output. Direct spawning
398
+ prevents shell interpretation but cannot hide private arguments from a
399
+ same-account process inspector, so keep such child lifetimes short and
400
+ document that local exposure.
401
+
402
+ For R2/R3, enter the durable dispatch boundary immediately before the effect.
403
+ Record an exact provider-accepted pending target when available. A lost,
404
+ malformed, timed-out, or signaled post-dispatch response is indeterminate and
405
+ must never be retried. Reconcile only with a separately reviewed exact read.
406
+ One local-CLI dispatch item is one fixed child invocation; if that command
407
+ performs an internal upload followed by a provider mutation, disclose the
408
+ opaque sequence and possible intermediate effect. Ghostget cannot fence those
409
+ internal calls separately, so uncertainty begins when the child starts.
410
+ Raw API/RPC, software and plugin lifecycle, account recovery, arbitrary file
411
+ output, destructive administration, and other high-authority commands remain
412
+ unavailable or R4 even if the upstream CLI exposes them.
413
+
414
+ ## Scaffold one source plugin
415
+
416
+ Start from one sanitized derivation candidate and one semantic operation:
417
+
418
+ ```sh
419
+ ghostget plugin scaffold \
420
+ --site example \
421
+ --display-name "Example" \
422
+ --origin https://www.example.com \
423
+ --operation feeds.read \
424
+ --risk R1 \
425
+ --evidence /absolute/private/derivation/internal-api-evidence.json \
426
+ --candidate 0 \
427
+ --output src/plugins/example-web \
428
+ --json
429
+ ```
430
+
431
+ `ghostget adapter scaffold` remains a compatibility alias. New agent workflows
432
+ should use `ghostget plugin scaffold`.
433
+
434
+ The scaffold creates one source-plugin directory containing:
435
+
436
+ - `plugin.ts`;
437
+ - `runtime.ts`;
438
+ - `plugin.test.ts`;
439
+ - `runtime.internal.test.ts`;
440
+ - `wrench-adapter.json`;
441
+ - `promotion-checklist.json`.
442
+
443
+ The generated plugin is network-inert and `capture-required`. Scaffolding does
444
+ not register it, install its manifest, promote its operation, or authorize a
445
+ live request.
446
+
447
+ ## Implement and register the contract
448
+
449
+ 1. Review the sanitized evidence and promotion checklist. Bind the exact
450
+ origin, method, path construction, query or body shape, fixed header sinks,
451
+ response variants, account, actor, target, incidental effects, and output
452
+ bounds in source.
453
+ 2. Keep the operation `capture-required` while any request, response, identity,
454
+ target, or drift fact is unknown. A type-correct runtime is not evidence.
455
+ 3. Add deterministic contract and runtime tests for the exact observed
456
+ exchange, malformed input, redirects, response drift, wrong identity,
457
+ output bounds, and secret redaction. Add dispatch and reconciliation cases
458
+ for R2/R3.
459
+ 4. Check the complete source unit before registration:
460
+
461
+ ```sh
462
+ ghostget plugin check src/plugins/example-web --json
463
+ bun test src/plugins/example-web
464
+ ```
465
+
466
+ 5. Keep the reviewed directory at `src/plugins/<plugin-id>` and run
467
+ `bun run src/scripts/generate-provider-plugin-catalog.ts`. The generator scans only that source root and
468
+ writes static imports. Do not add runtime directory scanning or load code
469
+ from local state.
470
+ List the plugin and provider entry roots in the implementation-source
471
+ closure. Ghostget then resolves and binds every recursive local value dependency,
472
+ so an agent can split JavaScript or TypeScript code into helpers without
473
+ manually maintaining a duplicate file list. Keep installed package loads
474
+ literal and declared when possible. Ghostget follows literal undeclared package
475
+ imports defensively, but rejects computed package loads because no
476
+ statically knowable implementation identity can include an unknown target.
477
+ Definitions are bounded before Ghostget copies their sources, bindings,
478
+ operations, contract histories, origins, auth kinds, scopes, coverage, or
479
+ input fields.
480
+ Source plugins are trusted repository code, not a hostile-code sandbox;
481
+ use a portable plugin whenever agent-authored code needs dynamic loading or
482
+ process isolation.
483
+ 6. Inspect the assembled result, then install and inspect the separate data
484
+ manifest:
485
+
486
+ ```sh
487
+ ghostget plugin show example-web --json
488
+ ghostget adapter validate src/plugins/example-web/wrench-adapter.json --json
489
+ ghostget adapter install src/plugins/example-web/wrench-adapter.json
490
+ ghostget capabilities example-web --json
491
+ ```
492
+
493
+ Promote an operation to `observed` only after deterministic tests and one
494
+ authorized low-stakes fixture prove the exact contract. A plugin update changes
495
+ its implementation identity and invalidates stale previews; it does not
496
+ reinterpret an unsettled historical receipt.
@@ -0,0 +1,78 @@
1
+ # Reddit flair
2
+
3
+ Inspect `ghostget capabilities reddit-web --json` before using flair.
4
+ `flair.user.choices` reads the bound account's self-selectable user flair.
5
+ `flair.post.choices` reads the post flair available for a new submission. Both
6
+ are observed R1 contracts:
7
+
8
+ ```sh
9
+ ghostget reddit-web flair.user.choices \
10
+ --auth <reddit-auth> \
11
+ --input '{"community":"Python"}' \
12
+ --json
13
+
14
+ ghostget reddit-web flair.post.choices \
15
+ --auth <reddit-auth> \
16
+ --input '{"community":"Python"}' \
17
+ --json
18
+ ```
19
+
20
+ The output contains exact template IDs, visible text, text editability,
21
+ position, and current-selection state. Duplicate IDs, malformed markup,
22
+ account drift, redirects, oversized responses, and unreviewed provider shapes
23
+ fail closed. Empty text is valid for an icon-only flair.
24
+
25
+ `flair.user.select` and `flair.post.select` remain **capture-required**. Their
26
+ schemas are reserved, but they perform no mutation. Do not report that Ghostget
27
+ can apply flair until the relevant selection contract is observed and an
28
+ independent same-account readback passes.
29
+
30
+ ## Choose flair under the caller's authority
31
+
32
+ When the user authorizes appropriate flair selection, choose it without asking
33
+ them to pick a label. Read the community's current rules, including expanded
34
+ authorship restrictions, and its live self-selectable choices. Post flair
35
+ classifies one contribution. User flair represents the account within one
36
+ community and can be required even for comments.
37
+
38
+ Match post flair to the content and use a required promotion category honestly.
39
+ Preserve an appropriate existing user flair. Otherwise choose a neutral label
40
+ or a role supported by the user's stated facts. Do not invent an occupation,
41
+ credential, diagnosis, housing status, or moderator role. Skip a destination
42
+ with no truthful choice. Flair does not make a prohibited contribution eligible.
43
+
44
+ The caller owns this decision. Ghostget supplies account-bound options and a
45
+ separate exact mutation boundary; it does not infer personal facts or run a
46
+ growth loop.
47
+
48
+ ## Complete a selection contract before enabling it
49
+
50
+ Use [managed derivation](derivation.md) for one explicitly authorized account,
51
+ community, and low-stakes selection. Verify the displayed account against the
52
+ outreach account before recording or changing anything. An existing browser
53
+ auth locator may belong to a different account; never silently substitute it.
54
+
55
+ Capture user and post selection separately. For a post, prove that it belongs
56
+ to the same account and community. The
57
+ [Reddit API reference](https://www.reddit.com/dev/api/) and
58
+ [PRAW's submission flair documentation](https://praw.readthedocs.io/en/stable/code_overview/other/submissionflair.html)
59
+ describe choices and selection; they do not prove an authenticated-web exchange.
60
+
61
+ The select contracts accept an exact template ID and its expected label, not
62
+ an arbitrary username, custom text, or moderator assignment. Before dispatch,
63
+ freshly read choices and reject a missing, changed, or non-self-selectable
64
+ template. Preserve an already selected matching flair without a mutation.
65
+ User selection is R2; changing flair on an existing public post is R3.
66
+
67
+ Keep the exact five-minute Ghostget preview and durable dispatch boundary.
68
+ Standing user authority lets the calling agent review and confirm its eligible
69
+ plan without requesting redundant approval. Confirm once and verify exact
70
+ account, community, post when relevant, template ID, and visible label through
71
+ independent readback. Treat uncertain writes as indeterminate, never retry them
72
+ blindly. A setup-only flair change is not a new public contribution.
73
+
74
+ Before promoting either selection contract, test account drift, wrong-post ownership,
75
+ template changes, moderator-only choices, duplicate labels, denied selection,
76
+ unexpected content type or redirect, and uncertain dispatch. Keep the other
77
+ contracts capture-required if their evidence is missing. No DOM recipe, raw
78
+ request fallback, or guessed endpoint belongs in the installed provider.