@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,310 @@
1
+ import {
2
+ defineProviderPlugin,
3
+ lazyLocalCliRuntime,
4
+ type LocalCliPluginOperationDefinitionV1,
5
+ } from "../../provider-plugin";
6
+ import {
7
+ linkedDeviceAuthKinds,
8
+ providerImplementationEntry,
9
+ } from "../../provider-plugin-builtins";
10
+ import type { InputSchema, OperationInput } from "../../model";
11
+ import {
12
+ BEEPER_CLI_PIN,
13
+ BEEPER_DESKTOP_API_PIN,
14
+ BEEPER_LOCAL_OPERATION_NAMES,
15
+ BEEPER_LOCAL_OPERATIONS,
16
+ parseBeeperOperationInputForContract,
17
+ type BeeperLocalOperationContractVersion,
18
+ type BeeperLocalOperationName,
19
+ } from "../../providers/beeper-local";
20
+ import {
21
+ materializeBeeperMessagingList,
22
+ materializeBeeperMessagingRead,
23
+ materializeBeeperMessagingReadV1,
24
+ materializeBeeperMessagingReadV2,
25
+ } from "../../providers/beeper-omni";
26
+ import { beeperMessagingDefinition } from "../../providers/beeper-messaging";
27
+ import beeperManifest from "../../assets/adapters/beeper/wrench-web-adapter.json";
28
+ import cliV2BeeperManifest from "../../assets/adapters/beeper/wrench-web-adapter.v2.3.0.json";
29
+ import predecessorBeeperManifest from "../../assets/adapters/beeper/wrench-web-adapter.v2.2.0.json";
30
+ import legacyBeeperManifest from "../../assets/adapters/beeper/wrench-web-adapter.v2.0.0.json";
31
+
32
+ type ManifestOperationProjection = Readonly<{
33
+ input: InputSchema;
34
+ sideEffect: string;
35
+ idempotency: "none" | "local-at-most-once";
36
+ dedupeWindowMs: number;
37
+ localCli: Readonly<{
38
+ surface: string;
39
+ action: string;
40
+ contractVersion: number;
41
+ }>;
42
+ }>;
43
+
44
+ const manifestOperations = beeperManifest.operations as unknown as Readonly<
45
+ Record<BeeperLocalOperationName, ManifestOperationProjection>
46
+ >;
47
+ const predecessorManifestOperations = predecessorBeeperManifest.operations as unknown as Readonly<
48
+ Record<BeeperLocalOperationName, ManifestOperationProjection>
49
+ >;
50
+ const cliV2ManifestOperations = cliV2BeeperManifest.operations as unknown as Readonly<
51
+ Record<BeeperLocalOperationName, ManifestOperationProjection>
52
+ >;
53
+ const legacyManifestOperations = legacyBeeperManifest.operations as unknown as Readonly<
54
+ Record<BeeperLocalOperationName, ManifestOperationProjection>
55
+ >;
56
+
57
+ const booleanDesiredKeys = Object.freeze({
58
+ "reactions.set": "enabled",
59
+ "conversations.archive.set": "enabled",
60
+ "conversations.pin.set": "enabled",
61
+ "conversations.mute.set": "enabled",
62
+ } as const satisfies Partial<Record<BeeperLocalOperationName, string>>);
63
+
64
+ const exactDesiredReadbacks = new Set<BeeperLocalOperationName>([
65
+ "messaging.edit",
66
+ "conversations.read-state.set",
67
+ "conversations.priority.set",
68
+ "conversations.title.set",
69
+ "conversations.description.set",
70
+ "conversations.avatar.set",
71
+ "conversations.draft.set",
72
+ "conversations.disappearing.set",
73
+ "conversations.reminder.set",
74
+ ]);
75
+
76
+ const BEEPER_DIRECT_READ_OPERATION_NAMES = Object.freeze([
77
+ "accounts.list",
78
+ "messaging.search",
79
+ "conversations.read",
80
+ "messaging.read",
81
+ "messaging.content.search",
82
+ ] as const satisfies readonly BeeperLocalOperationName[]);
83
+
84
+ const BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES = Object.freeze([
85
+ "bridges.list",
86
+ "contacts.list",
87
+ ] as const satisfies readonly BeeperLocalOperationName[]);
88
+
89
+ function validateBeeperInput(
90
+ action: BeeperLocalOperationName,
91
+ contractVersion: BeeperLocalOperationContractVersion,
92
+ input: OperationInput,
93
+ ): readonly string[] {
94
+ try {
95
+ parseBeeperOperationInputForContract(action, contractVersion, input);
96
+ return Object.freeze([]);
97
+ } catch {
98
+ return Object.freeze([
99
+ `${action} input does not match the pinned Beeper ${
100
+ contractVersion === 1
101
+ || contractVersion === 2
102
+ && BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES.includes(
103
+ action as typeof BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES[number],
104
+ )
105
+ ? "CLI"
106
+ : "Desktop direct-read"
107
+ } contract`,
108
+ ]);
109
+ }
110
+ }
111
+
112
+ function reconciliationFor(
113
+ action: BeeperLocalOperationName,
114
+ ): LocalCliPluginOperationDefinitionV1["reconciliation"] {
115
+ if (action === "messaging.send" || action === "conversations.start") {
116
+ return Object.freeze({ kind: "provider-accepted-target-presence" as const });
117
+ }
118
+ const booleanKey = booleanDesiredKeys[action as keyof typeof booleanDesiredKeys];
119
+ if (booleanKey !== undefined) {
120
+ return Object.freeze({
121
+ kind: "boolean-desired-state" as const,
122
+ desiredState: (input: OperationInput): boolean => {
123
+ const value = input[booleanKey];
124
+ if (typeof value !== "boolean") {
125
+ throw new Error(`${action} reconciliation requires one boolean desired state`);
126
+ }
127
+ return value;
128
+ },
129
+ });
130
+ }
131
+ if (exactDesiredReadbacks.has(action)) {
132
+ return Object.freeze({
133
+ kind: "boolean-desired-state" as const,
134
+ desiredState: (): boolean => true,
135
+ });
136
+ }
137
+ return undefined;
138
+ }
139
+
140
+ function omniFor(
141
+ action: BeeperLocalOperationName,
142
+ contractVersion: BeeperLocalOperationContractVersion,
143
+ ): LocalCliPluginOperationDefinitionV1["omni"] {
144
+ if (action === "messaging.list") {
145
+ return Object.freeze({
146
+ state: "supported" as const,
147
+ schemaVersion: 1 as const,
148
+ materializerId: "beeper-messaging-list",
149
+ materializerVersion: 2,
150
+ materialize: materializeBeeperMessagingList,
151
+ });
152
+ }
153
+ if (action === "messaging.read") {
154
+ return Object.freeze({
155
+ state: "supported" as const,
156
+ schemaVersion: 1 as const,
157
+ materializerId: "beeper-messaging-read",
158
+ materializerVersion: contractVersion === 3 ? 5 : 2,
159
+ materialize: contractVersion === 3
160
+ ? materializeBeeperMessagingRead
161
+ : contractVersion === 2
162
+ ? materializeBeeperMessagingReadV2
163
+ : materializeBeeperMessagingReadV1,
164
+ });
165
+ }
166
+ return undefined;
167
+ }
168
+
169
+ function operationDefinition(
170
+ action: BeeperLocalOperationName,
171
+ contractVersion: BeeperLocalOperationContractVersion,
172
+ ): LocalCliPluginOperationDefinitionV1 {
173
+ const manifestOperation = contractVersion === 1
174
+ ? legacyManifestOperations[action]
175
+ : contractVersion === 2
176
+ && BEEPER_DIRECT_READ_OPERATION_NAMES.includes(
177
+ action as typeof BEEPER_DIRECT_READ_OPERATION_NAMES[number],
178
+ )
179
+ ? predecessorManifestOperations[action]
180
+ : contractVersion === 2
181
+ && BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES.includes(
182
+ action as typeof BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES[number],
183
+ )
184
+ ? cliV2ManifestOperations[action]
185
+ : manifestOperations[action];
186
+ if (
187
+ manifestOperation.localCli.surface !== "beeper"
188
+ || manifestOperation.localCli.action !== action
189
+ || manifestOperation.localCli.contractVersion !== contractVersion
190
+ ) {
191
+ throw new Error(
192
+ `Beeper manifest contract drifted for ${action}@${String(contractVersion)}`,
193
+ );
194
+ }
195
+ const policy = BEEPER_LOCAL_OPERATIONS[action];
196
+ const reconciliation = reconciliationFor(action);
197
+ const omni = omniFor(action, contractVersion);
198
+ return Object.freeze({
199
+ name: action,
200
+ contractVersion,
201
+ risk: policy.risk,
202
+ input: manifestOperation.input,
203
+ sideEffect: manifestOperation.sideEffect,
204
+ idempotency: manifestOperation.idempotency,
205
+ dedupeWindowMs: manifestOperation.dedupeWindowMs,
206
+ state: "observed" as const,
207
+ dispatch: policy.effect === "read"
208
+ ? "none" as const
209
+ : action === "presence.set" ? "bounded-items" as const : "single" as const,
210
+ implementation: contractVersion === 1
211
+ || contractVersion === 2
212
+ && BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES.includes(
213
+ action as typeof BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES[number],
214
+ )
215
+ ? `official Beeper CLI ${BEEPER_CLI_PIN.version} over ${BEEPER_DESKTOP_API_PIN.package}@${BEEPER_DESKTOP_API_PIN.version}+${BEEPER_DESKTOP_API_PIN.commit} ${action} with exact input, target, realm, output, and dispatch binding`
216
+ : `official ${BEEPER_DESKTOP_API_PIN.package}@${BEEPER_DESKTOP_API_PIN.version}+${BEEPER_DESKTOP_API_PIN.commit} fixed Beeper Desktop loopback read for ${action} with exact input, target, realm, bounded output, and no CLI or transport fallback`,
217
+ planDispatches: (input: OperationInput) => {
218
+ const parsed = parseBeeperOperationInputForContract(
219
+ action,
220
+ contractVersion,
221
+ input,
222
+ );
223
+ if (policy.effect === "read") return Object.freeze([]);
224
+ const count = action === "presence.set"
225
+ && "durationSeconds" in parsed
226
+ && parsed.durationSeconds !== null
227
+ ? 2
228
+ : 1;
229
+ return Object.freeze(Array.from({ length: count }, (_unused, index) =>
230
+ Object.freeze({
231
+ id: count === 1 ? action : `${action}[${index + 1}]`,
232
+ description: action === "presence.set" && index === 1
233
+ ? "Send the separately journaled paused indication after the confirmed bounded delay"
234
+ : policy.reason,
235
+ })));
236
+ },
237
+ validateInput: (input: OperationInput) =>
238
+ validateBeeperInput(action, contractVersion, input),
239
+ ...(reconciliation === undefined ? {} : { reconciliation }),
240
+ ...(omni === undefined ? {} : { omni }),
241
+ } satisfies LocalCliPluginOperationDefinitionV1);
242
+ }
243
+
244
+ const operations = Object.freeze([
245
+ ...BEEPER_LOCAL_OPERATION_NAMES.map((action) =>
246
+ operationDefinition(action, 1)),
247
+ ...BEEPER_DIRECT_READ_OPERATION_NAMES.map((action) =>
248
+ operationDefinition(action, 2)),
249
+ ...BEEPER_CLI_CONTRACT_V2_OPERATION_NAMES.map((action) =>
250
+ operationDefinition(action, 2)),
251
+ operationDefinition("messaging.read", 3),
252
+ operationDefinition("contacts.list", 3),
253
+ ]);
254
+
255
+ export const beeperLinkedDevicePlugin = defineProviderPlugin({
256
+ apiVersion: 1,
257
+ id: "beeper-linked-device",
258
+ version: "2.4.0",
259
+ displayName: "Beeper Pinned Local CLI",
260
+ sourceKind: "built-in",
261
+ implementationSources: providerImplementationEntry(import.meta.url),
262
+ bindings: [{
263
+ transport: "local-cli",
264
+ surfaceId: "beeper",
265
+ origin: "https://www.beeper.com",
266
+ protectedHostnameFamilies: ["beeper.com"],
267
+ authKinds: linkedDeviceAuthKinds,
268
+ tool: {
269
+ schemaVersion: 1,
270
+ id: BEEPER_CLI_PIN.id,
271
+ implementation: BEEPER_CLI_PIN.implementation,
272
+ versionScheme: "semver",
273
+ version: BEEPER_CLI_PIN.version,
274
+ releaseCommit: BEEPER_CLI_PIN.commit,
275
+ releaseManifestSha256: BEEPER_CLI_PIN.releaseManifestSha256,
276
+ releaseManifestUrl: BEEPER_CLI_PIN.releaseManifestUrl,
277
+ sourceUrl: BEEPER_CLI_PIN.sourceUrl,
278
+ artifacts: BEEPER_CLI_PIN.artifacts,
279
+ },
280
+ operations,
281
+ subject: {
282
+ format: "beeper:local:<sha256-account-and-desktop-target-coordinate>",
283
+ matches: (value) => /^beeper:local:[a-f0-9]{64}$/u.test(value),
284
+ },
285
+ messaging: beeperMessagingDefinition,
286
+ runtime: lazyLocalCliRuntime(async () => {
287
+ const runtime = await import("../../providers/beeper-local-runtime");
288
+ return {
289
+ inspect: runtime.inspectBeeperLocalRuntime,
290
+ probe: runtime.probeBeeperLocalSubject,
291
+ execute: (_manifest, recipe, input, auth, options) =>
292
+ runtime.executeBeeperLocalOperation(recipe, input, auth, options),
293
+ executeMessagingPart: (operation, input, auth, attempt) => {
294
+ if (operation !== "messaging.send") {
295
+ throw new Error("Beeper direct messaging runtime accepts only messaging.send");
296
+ }
297
+ return runtime.executeBeeperDirectMessagingPart(input, auth, {
298
+ beforeExternalBegin: attempt.beforeExternalBegin,
299
+ operationDeadline: attempt.operationDeadline,
300
+ signal: attempt.signal,
301
+ environment: attempt.environment,
302
+ });
303
+ },
304
+ reconcile: runtime.reconcileBeeperLocalOperation,
305
+ };
306
+ }),
307
+ }],
308
+ });
309
+
310
+ export default beeperLinkedDevicePlugin;
@@ -0,0 +1,178 @@
1
+ import {
2
+ defineProviderPlugin,
3
+ lazyWebSessionRuntime,
4
+ } from "../../provider-plugin";
5
+ import {
6
+ webSessionContractOperations,
7
+ webImplementationSources,
8
+ } from "../../provider-plugin-builtins";
9
+ import { webSessionContractDefinitions } from "../../web-session-contract-definitions";
10
+
11
+ const blueskyContracts = webSessionContractDefinitions.bluesky;
12
+ if (blueskyContracts === undefined) {
13
+ throw new Error("Bluesky web-session contracts are not installed");
14
+ }
15
+
16
+ const desiredStateKeys = Object.freeze({
17
+ "likes.set": "liked",
18
+ "content.save": "saved",
19
+ "relationships.follow.set": "followed",
20
+ "posts.repost": "reposted",
21
+ } as const);
22
+
23
+ const operations = webSessionContractOperations(
24
+ Object.values(blueskyContracts),
25
+ "3a33d0a329d701207e83cd926a87abe9914e04d38c59cae0c8d8fcd24462c628",
26
+ {
27
+ "profiles.read": [1],
28
+ "posts.publish": [2],
29
+ },
30
+ {
31
+ "messaging.list": {
32
+ state: "unsupported",
33
+ reason: "Bluesky inbox identity, pagination, completeness, and acknowledgement-free behavior remain capture-required",
34
+ },
35
+ "messaging.read": {
36
+ state: "unsupported",
37
+ reason: "Bluesky conversation reads remain capture-required despite the presence of unshipped parser code",
38
+ },
39
+ },
40
+ ).map((operation) => {
41
+ if (operation.name === "profiles.read") {
42
+ return Object.freeze({
43
+ ...operation,
44
+ access: "public" as const,
45
+ });
46
+ }
47
+ if (operation.name === "posts.publish" || operation.name === "media.publish") {
48
+ return Object.freeze({
49
+ ...operation,
50
+ reconciliation: Object.freeze({
51
+ kind: "provider-accepted-target-presence" as const,
52
+ }),
53
+ });
54
+ }
55
+ if (operation.name === "content.delete") {
56
+ return Object.freeze({
57
+ ...operation,
58
+ reconciliation: Object.freeze({
59
+ kind: "boolean-desired-state" as const,
60
+ desiredState: (): boolean => false,
61
+ }),
62
+ });
63
+ }
64
+ if (!Object.hasOwn(desiredStateKeys, operation.name)) return operation;
65
+ const stateKey = desiredStateKeys[
66
+ operation.name as keyof typeof desiredStateKeys
67
+ ];
68
+ return Object.freeze({
69
+ ...operation,
70
+ reconciliation: Object.freeze({
71
+ kind: "boolean-desired-state" as const,
72
+ desiredState: (input: Readonly<Record<string, unknown>>): boolean => {
73
+ const value = input[stateKey];
74
+ if (typeof value !== "boolean") {
75
+ throw new Error(
76
+ `Bluesky ${operation.name} reconciliation requires boolean input.${stateKey}`,
77
+ );
78
+ }
79
+ return value;
80
+ },
81
+ }),
82
+ });
83
+ });
84
+
85
+ export const blueskyWebPlugin = defineProviderPlugin({
86
+ apiVersion: 1,
87
+ id: "bluesky-web",
88
+ version: "1.4.0",
89
+ displayName: "Bluesky Web API",
90
+ sourceKind: "built-in",
91
+ implementationSources: webImplementationSources(import.meta.url, [
92
+ ["providers/read-failure.ts", "../../providers/read-failure.ts"],
93
+ ["kernel/browser.ts", "../../browser.ts"],
94
+ ["kernel/session-secrets.ts", "../../session-secrets.ts"],
95
+ ["providers/iso-bmff.ts", "../../providers/iso-bmff.ts"],
96
+ ["providers/bluesky-web.ts", "../../providers/bluesky-web.ts"],
97
+ ["providers/bluesky-web-runtime.ts", "../../providers/bluesky-web-runtime.ts"],
98
+ ]),
99
+ bindings: [{
100
+ transport: "web-session-api",
101
+ surfaceId: "bluesky",
102
+ origin: "https://bsky.app",
103
+ protectedHostnameFamilies: [
104
+ "bsky.app",
105
+ "bsky.social",
106
+ "host.bsky.network",
107
+ "video.bsky.app",
108
+ ],
109
+ authKinds: ["browser-profile"],
110
+ operations,
111
+ subject: {
112
+ format: "did:plc:<id> or did:web:<host>",
113
+ matches: (value) => /^did:(?:plc:[a-z2-7]{24}|web:[A-Za-z0-9._:%-]{1,240})$/u.test(value),
114
+ },
115
+ runtime: lazyWebSessionRuntime(async () => {
116
+ const runtime = await import("../../providers/bluesky-web-runtime");
117
+ return {
118
+ probe: runtime.probeBlueskyWebSubject,
119
+ executePublic: (_manifest, recipe, input, options) =>
120
+ runtime.executeBlueskyPublicProfileRead(
121
+ recipe,
122
+ input,
123
+ undefined,
124
+ options.operationDeadline,
125
+ ),
126
+ execute: (_manifest, recipe, input, auth, options) =>
127
+ runtime.executeBlueskyWebOperation(recipe, input, auth, options),
128
+ reconcile: async (operation, input, auth, context) => {
129
+ if (operation === "posts.publish" || operation === "media.publish") {
130
+ if (context?.kind !== "provider-accepted-target-presence") {
131
+ throw new Error(`Bluesky ${operation} reconciliation requires one exact accepted target`);
132
+ }
133
+ const readback = await runtime.readBlueskyWebPublishedMutationTarget({
134
+ site: "bluesky",
135
+ action: operation,
136
+ contractVersion: operation === "posts.publish" ? 3 : 2,
137
+ timeoutMs: 60_000,
138
+ maxOutputBytes: 8 * 1024 * 1024,
139
+ }, input, auth, context.target.identifier);
140
+ return {
141
+ actualState: readback.present,
142
+ reason: "exact-target-readback",
143
+ };
144
+ }
145
+ if (operation === "content.delete") {
146
+ const readback = await runtime.readBlueskyWebContentDeleteDesiredState({
147
+ site: "bluesky",
148
+ action: operation,
149
+ contractVersion: 1,
150
+ timeoutMs: 60_000,
151
+ maxOutputBytes: 8 * 1024 * 1024,
152
+ }, input, auth);
153
+ return {
154
+ actualState: readback.present,
155
+ reason: "authoritative-record-readback",
156
+ };
157
+ }
158
+ if (!Object.hasOwn(desiredStateKeys, operation)) {
159
+ throw new Error(`Bluesky ${operation} has no reconciliation hook`);
160
+ }
161
+ const readback = await runtime.readBlueskyWebDesiredState({
162
+ site: "bluesky",
163
+ action: operation,
164
+ contractVersion: 1,
165
+ timeoutMs: 60_000,
166
+ maxOutputBytes: 8 * 1024 * 1024,
167
+ }, input, auth);
168
+ return {
169
+ actualState: readback.enabled,
170
+ reason: "exact-readback",
171
+ };
172
+ },
173
+ };
174
+ }),
175
+ }],
176
+ });
177
+
178
+ export default blueskyWebPlugin;
@@ -0,0 +1,66 @@
1
+ import {
2
+ defineProviderPlugin,
3
+ lazyWebSessionRuntime,
4
+ } from "../../provider-plugin";
5
+ import {
6
+ webImplementationSources,
7
+ webSessionContractOperations,
8
+ } from "../../provider-plugin-builtins";
9
+ import { CLASIFICADOS_LISTINGS_SEARCH_CONTRACT } from "../../providers/clasificados-web";
10
+
11
+ const operations = webSessionContractOperations(
12
+ [CLASIFICADOS_LISTINGS_SEARCH_CONTRACT],
13
+ "689290bbaf7b3ddd83ca48f22c33008ae1bb2ffed2f5aa89fd3a77aed873d298",
14
+ ).map((operation) => Object.freeze({
15
+ ...operation,
16
+ access: "public" as const,
17
+ }));
18
+
19
+ export const clasificadosWebPlugin = defineProviderPlugin({
20
+ apiVersion: 1,
21
+ id: "clasificados-web",
22
+ version: "1.0.0",
23
+ displayName: "ClasificadosOnline Public Rental Listings",
24
+ sourceKind: "built-in",
25
+ implementationSources: webImplementationSources(import.meta.url, [
26
+ ["providers/read-failure.ts", "../../providers/read-failure.ts"],
27
+ ["providers/rental-listings.ts", "../../providers/rental-listings.ts"],
28
+ ["providers/clasificados-web.ts", "../../providers/clasificados-web.ts"],
29
+ ["providers/clasificados-web-runtime.ts", "../../providers/clasificados-web-runtime.ts"],
30
+ ]),
31
+ bindings: [{
32
+ transport: "web-session-api",
33
+ surfaceId: "clasificados",
34
+ origin: "https://www.clasificadosonline.com",
35
+ manifestOrigins: ["https://www.clasificadosonline.com"],
36
+ protectedHostnameFamilies: ["www.clasificadosonline.com"],
37
+ authKinds: ["browser-profile"],
38
+ operations,
39
+ subject: {
40
+ format: "clasificados:public",
41
+ matches: (value) => value === "clasificados:public",
42
+ },
43
+ runtime: lazyWebSessionRuntime(async () => {
44
+ const runtime = await import("../../providers/clasificados-web-runtime");
45
+ return {
46
+ probe: runtime.probeClasificadosWebSubject,
47
+ execute: runtime.executeClasificadosAuthenticatedOperation,
48
+ executePublic: (_manifest, recipe, input, options) => {
49
+ if (recipe.action !== "listings.search") {
50
+ return Promise.reject(
51
+ new Error("Clasificados public operation is not installed"),
52
+ );
53
+ }
54
+ return runtime.executeClasificadosPublicListingsSearch(
55
+ recipe,
56
+ input,
57
+ undefined,
58
+ options.operationDeadline,
59
+ );
60
+ },
61
+ };
62
+ }),
63
+ }],
64
+ });
65
+
66
+ export default clasificadosWebPlugin;
@@ -0,0 +1,80 @@
1
+ import {
2
+ defineProviderPlugin,
3
+ lazyWebSessionRuntime,
4
+ } from "../../provider-plugin";
5
+ import {
6
+ webImplementationSources,
7
+ webSessionContractOperations,
8
+ } from "../../provider-plugin-builtins";
9
+ import { webSessionContractDefinitions } from "../../web-session-contract-definitions";
10
+
11
+ const githubContracts = webSessionContractDefinitions.github;
12
+ if (githubContracts === undefined) {
13
+ throw new Error("GitHub web-session contracts are not installed");
14
+ }
15
+
16
+ const operations = webSessionContractOperations(
17
+ Object.values(githubContracts),
18
+ "ee1f44dca49dfaf7fdf06831765abf3775a97914821b9b3856684067d2acea84",
19
+ ).map((operation) => Object.freeze({
20
+ ...operation,
21
+ access: "public" as const,
22
+ }));
23
+
24
+ export const githubWebPlugin = defineProviderPlugin({
25
+ apiVersion: 1,
26
+ id: "github-web",
27
+ version: "1.2.0",
28
+ displayName: "GitHub Public Statistics API",
29
+ sourceKind: "built-in",
30
+ implementationSources: webImplementationSources(import.meta.url, [
31
+ ["providers/read-failure.ts", "../../providers/read-failure.ts"],
32
+ ["providers/github-web.ts", "../../providers/github-web.ts"],
33
+ ["providers/github-web-runtime.ts", "../../providers/github-web-runtime.ts"],
34
+ ]),
35
+ bindings: [{
36
+ transport: "web-session-api",
37
+ surfaceId: "github",
38
+ origin: "https://api.github.com",
39
+ manifestOrigins: ["https://github.com"],
40
+ protectedHostnameFamilies: ["api.github.com", "github.com"],
41
+ authKinds: ["browser-profile"],
42
+ operations,
43
+ subject: {
44
+ format: "github:<username>",
45
+ matches: (value) =>
46
+ /^github:[a-z0-9](?:[a-z0-9-]{0,37}[a-z0-9])?$/u.test(value),
47
+ },
48
+ runtime: lazyWebSessionRuntime(async () => {
49
+ const runtime = await import("../../providers/github-web-runtime");
50
+ return {
51
+ probe: runtime.probeGitHubWebSubject,
52
+ execute: runtime.executeGitHubAuthenticatedOperation,
53
+ executePublic: (_manifest, recipe, input, options) => {
54
+ switch (recipe.action) {
55
+ case "profiles.read":
56
+ return runtime.executeGitHubPublicProfileRead(
57
+ recipe,
58
+ input,
59
+ undefined,
60
+ options.operationDeadline,
61
+ );
62
+ case "organizations.read":
63
+ return runtime.executeGitHubPublicOrganizationRead(
64
+ recipe,
65
+ input,
66
+ undefined,
67
+ options.operationDeadline,
68
+ );
69
+ default:
70
+ return Promise.reject(
71
+ new Error("GitHub public operation is not installed"),
72
+ );
73
+ }
74
+ },
75
+ };
76
+ }),
77
+ }],
78
+ });
79
+
80
+ export default githubWebPlugin;