fedipod-server 0.28.1 → 0.30.0

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 (438) hide show
  1. package/README.md +38 -34
  2. package/config/server.json +22 -0
  3. package/dist/claims.js +3 -2
  4. package/dist/directory.d.ts +2 -0
  5. package/dist/door.d.ts +4 -0
  6. package/dist/door.js +31 -0
  7. package/dist/fedipod.d.ts +16 -0
  8. package/dist/fedipod.js +13 -0
  9. package/dist/front.d.ts +3 -0
  10. package/dist/front.js +94 -0
  11. package/dist/handler.d.ts +39 -101
  12. package/dist/handler.js +86 -617
  13. package/dist/handler.jsonld +6 -30
  14. package/dist/identities.d.ts +62 -0
  15. package/dist/identities.js +236 -0
  16. package/dist/mounts.d.ts +43 -0
  17. package/dist/mounts.js +123 -0
  18. package/dist/opt-in.d.ts +46 -0
  19. package/dist/opt-in.js +176 -0
  20. package/dist/store-pod.js +37 -0
  21. package/package.json +10 -18
  22. package/lib/client/c2s.mjs +0 -582
  23. package/lib/client/localapi.mjs +0 -87
  24. package/lib/client/masto/accounts.mjs +0 -309
  25. package/lib/client/masto/body.mjs +0 -156
  26. package/lib/client/masto/index.mjs +0 -206
  27. package/lib/client/masto/instance.mjs +0 -112
  28. package/lib/client/masto/media.mjs +0 -79
  29. package/lib/client/masto/oauth.mjs +0 -656
  30. package/lib/client/masto/render.mjs +0 -518
  31. package/lib/client/masto/statuses.mjs +0 -372
  32. package/lib/client/masto/timelines.mjs +0 -438
  33. package/lib/client/oidc-auth.mjs +0 -62
  34. package/lib/client/streaming.mjs +0 -154
  35. package/lib/client/webpush.mjs +0 -98
  36. package/lib/connections/acctfeed.mjs +0 -257
  37. package/lib/connections/atproto.mjs +0 -309
  38. package/lib/connections/bskyfeed.mjs +0 -243
  39. package/lib/connections/bskygroup.mjs +0 -162
  40. package/lib/connections/fediacct.mjs +0 -253
  41. package/lib/connections/import.mjs +0 -357
  42. package/lib/connections/tagfeed.mjs +0 -212
  43. package/lib/connections/vault.mjs +0 -114
  44. package/lib/core/as2.mjs +0 -206
  45. package/lib/core/contexts/activitystreams.json +0 -379
  46. package/lib/core/contexts/anno.json +0 -126
  47. package/lib/core/contexts/did-v1.json +0 -57
  48. package/lib/core/contexts/fep-5711.json +0 -36
  49. package/lib/core/contexts/gotosocial.json +0 -86
  50. package/lib/core/contexts/identity-v1.json +0 -152
  51. package/lib/core/contexts/index.mjs +0 -63
  52. package/lib/core/contexts/join-lemmy.json +0 -33
  53. package/lib/core/contexts/joinmastodon.json +0 -28
  54. package/lib/core/contexts/litepub-0.1.json +0 -60
  55. package/lib/core/contexts/map.json +0 -19
  56. package/lib/core/contexts/miscellany.json +0 -19
  57. package/lib/core/contexts/quotes.json +0 -18
  58. package/lib/core/contexts/schemaorg.json +0 -8845
  59. package/lib/core/contexts/security-data-integrity-v1.json +0 -78
  60. package/lib/core/contexts/security-data-integrity-v2.json +0 -81
  61. package/lib/core/contexts/security-multikey-v1.json +0 -35
  62. package/lib/core/contexts/security-v1.json +0 -74
  63. package/lib/core/contexts/webfinger.json +0 -10
  64. package/lib/core/deliver.mjs +0 -371
  65. package/lib/core/graphview.mjs +0 -327
  66. package/lib/core/intake/activities.mjs +0 -633
  67. package/lib/core/intake/activity.mjs +0 -318
  68. package/lib/core/intake/channel.mjs +0 -144
  69. package/lib/core/intake/group.mjs +0 -256
  70. package/lib/core/intake/index.mjs +0 -701
  71. package/lib/core/intake/notes.mjs +0 -360
  72. package/lib/core/intake/verify.mjs +0 -142
  73. package/lib/core/keys.mjs +0 -153
  74. package/lib/core/lease.mjs +0 -206
  75. package/lib/core/polls.mjs +0 -105
  76. package/lib/core/profile-page.mjs +0 -104
  77. package/lib/core/proof.mjs +0 -79
  78. package/lib/core/publisher/collections.mjs +0 -237
  79. package/lib/core/publisher/index.mjs +0 -500
  80. package/lib/core/publisher/notes.mjs +0 -453
  81. package/lib/core/publisher/questions.mjs +0 -239
  82. package/lib/core/publisher/restore.mjs +0 -224
  83. package/lib/core/shapes/activitystreams.ttl +0 -157
  84. package/lib/core/shapes/index.mjs +0 -132
  85. package/lib/core/shapes/shapes-text.mjs +0 -13
  86. package/lib/core/social.mjs +0 -531
  87. package/lib/core/storage.mjs +0 -176
  88. package/lib/core/store.mjs +0 -568
  89. package/lib/core/wire-quotes.mjs +0 -71
  90. package/lib/core/wire.mjs +0 -889
  91. package/lib/device/account.mjs +0 -87
  92. package/lib/device/admin/index.mjs +0 -13
  93. package/lib/device/admin/origins.mjs +0 -35
  94. package/lib/device/admin/routes/connections.mjs +0 -144
  95. package/lib/device/admin/routes/gateway.mjs +0 -199
  96. package/lib/device/admin/routes/lifecycle.mjs +0 -200
  97. package/lib/device/admin/routes/owner.mjs +0 -322
  98. package/lib/device/admin/routes/setup.mjs +0 -412
  99. package/lib/device/admin/routes/social.mjs +0 -188
  100. package/lib/device/admin/server.mjs +0 -95
  101. package/lib/device/admin/static.mjs +0 -247
  102. package/lib/device/admin/surface.mjs +0 -315
  103. package/lib/device/certs.mjs +0 -281
  104. package/lib/device/cli/commands/account.mjs +0 -586
  105. package/lib/device/cli/commands/run.mjs +0 -278
  106. package/lib/device/cli/commands/service.mjs +0 -221
  107. package/lib/device/cli/commands/setup.mjs +0 -447
  108. package/lib/device/cli/commands/state.mjs +0 -561
  109. package/lib/device/cli/context.mjs +0 -288
  110. package/lib/device/export-collections.mjs +0 -161
  111. package/lib/device/gateway-move.mjs +0 -58
  112. package/lib/device/home.mjs +0 -161
  113. package/lib/device/migrate.mjs +0 -115
  114. package/lib/device/ports.mjs +0 -27
  115. package/lib/device/remote.mjs +0 -54
  116. package/lib/device/setup.mjs +0 -459
  117. package/lib/device/update.mjs +0 -96
  118. package/lib/gateway/caches.mjs +0 -36
  119. package/lib/gateway/directory.mjs +0 -90
  120. package/lib/gateway/front-core.mjs +0 -970
  121. package/lib/gateway/gateway-core.mjs +0 -165
  122. package/lib/gateway/headers.mjs +0 -49
  123. package/lib/gateway/httpsig.mjs +0 -159
  124. package/lib/gateway/notices.mjs +0 -84
  125. package/lib/gateway/quiet.mjs +0 -189
  126. package/lib/pod/README.md +0 -61
  127. package/lib/pod/actor.mjs +0 -96
  128. package/lib/pod/collection.mjs +0 -77
  129. package/lib/pod/containers.mjs +0 -140
  130. package/lib/pod/discovery.mjs +0 -46
  131. package/lib/pod/featured.mjs +0 -18
  132. package/lib/pod/followers.mjs +0 -24
  133. package/lib/pod/following.mjs +0 -10
  134. package/lib/pod/http.mjs +0 -74
  135. package/lib/pod/inbox.mjs +0 -166
  136. package/lib/pod/links.mjs +0 -35
  137. package/lib/pod/media.mjs +0 -27
  138. package/lib/pod/notes.mjs +0 -80
  139. package/lib/pod/notifications.mjs +0 -89
  140. package/lib/pod/outbox.mjs +0 -18
  141. package/lib/pod/package.json +0 -19
  142. package/lib/pod/policy.mjs +0 -58
  143. package/lib/pod/private.mjs +0 -19
  144. package/lib/pod/root.mjs +0 -104
  145. package/lib/pod/state.mjs +0 -40
  146. package/lib/pod/transport.mjs +0 -525
  147. package/lib/pod/urls.mjs +0 -85
  148. package/lib/server/embed.mjs +0 -423
  149. package/lib/session/README.md +0 -137
  150. package/lib/session/demo.html +0 -94
  151. package/lib/session/fedi-account.mjs +0 -408
  152. package/lib/session/fedi-login.mjs +0 -123
  153. package/lib/session/oidc-session.mjs +0 -233
  154. package/lib/session/package.json +0 -49
  155. package/lib/shared/guard.mjs +0 -213
  156. package/lib/shared/links.mjs +0 -9
  157. package/lib/shared/safefetch.mjs +0 -235
  158. package/lib/shared/ua.mjs +0 -29
  159. package/phanpy/dist/404.html +0 -40
  160. package/phanpy/dist/_headers +0 -2
  161. package/phanpy/dist/apple-touch-icon.png +0 -0
  162. package/phanpy/dist/assets/ICONS-DIPJeU0C.js +0 -2
  163. package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +0 -1
  164. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +0 -183
  165. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
  166. package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
  167. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +0 -2
  168. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +0 -1
  169. package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
  170. package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
  171. package/phanpy/dist/assets/chunk-aKtaBQYM.js +0 -1
  172. package/phanpy/dist/assets/compose-CFEx7wb4.js +0 -2
  173. package/phanpy/dist/assets/compose-CFEx7wb4.js.map +0 -1
  174. package/phanpy/dist/assets/compose-ZJN5xSb4.js +0 -35
  175. package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +0 -1
  176. package/phanpy/dist/assets/debug.module-YFQgwnIr.js +0 -52
  177. package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +0 -1
  178. package/phanpy/dist/assets/dom-p1YcJ5Rw.js +0 -2
  179. package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +0 -1
  180. package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
  181. package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
  182. package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
  183. package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
  184. package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +0 -1
  185. package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +0 -1
  186. package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
  187. package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +0 -1
  188. package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
  189. package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
  190. package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
  191. package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
  192. package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
  193. package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
  194. package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
  195. package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
  196. package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +0 -1
  197. package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +0 -1
  198. package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
  199. package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +0 -1
  200. package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
  201. package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +0 -1
  202. package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
  203. package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
  204. package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +0 -1
  205. package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
  206. package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +0 -1
  207. package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
  208. package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
  209. package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
  210. package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
  211. package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
  212. package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +0 -1
  213. package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +0 -1
  214. package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +0 -1
  215. package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +0 -1
  216. package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +0 -1
  217. package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
  218. package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +0 -1
  219. package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
  220. package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +0 -1
  221. package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +0 -1
  222. package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +0 -1
  223. package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
  224. package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
  225. package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +0 -1
  226. package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +0 -1
  227. package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
  228. package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
  229. package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +0 -1
  230. package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +0 -1
  231. package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +0 -1
  232. package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
  233. package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +0 -1
  234. package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +0 -1
  235. package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +0 -1
  236. package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
  237. package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
  238. package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
  239. package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +0 -1
  240. package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +0 -1
  241. package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +0 -1
  242. package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +0 -1
  243. package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +0 -1
  244. package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
  245. package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
  246. package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +0 -1
  247. package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +0 -1
  248. package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +0 -1
  249. package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +0 -1
  250. package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +0 -1
  251. package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +0 -1
  252. package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +0 -1
  253. package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +0 -1
  254. package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
  255. package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +0 -1
  256. package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +0 -1
  257. package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +0 -1
  258. package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
  259. package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +0 -1
  260. package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +0 -1
  261. package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
  262. package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
  263. package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
  264. package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +0 -1
  265. package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +0 -1
  266. package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
  267. package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +0 -1
  268. package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +0 -1
  269. package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +0 -1
  270. package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +0 -1
  271. package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +0 -1
  272. package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +0 -1
  273. package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +0 -1
  274. package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +0 -1
  275. package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +0 -1
  276. package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
  277. package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +0 -1
  278. package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
  279. package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
  280. package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
  281. package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +0 -1
  282. package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
  283. package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +0 -1
  284. package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +0 -1
  285. package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
  286. package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +0 -1
  287. package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
  288. package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +0 -1
  289. package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
  290. package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +0 -1
  291. package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +0 -1
  292. package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
  293. package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +0 -1
  294. package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +0 -1
  295. package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
  296. package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +0 -1
  297. package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +0 -1
  298. package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +0 -1
  299. package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
  300. package/phanpy/dist/assets/instances-BNPptnn-.json +0 -333
  301. package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +0 -1
  302. package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +0 -1
  303. package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
  304. package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +0 -1
  305. package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +0 -1
  306. package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +0 -1
  307. package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +0 -1
  308. package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +0 -1
  309. package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +0 -1
  310. package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +0 -1
  311. package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +0 -1
  312. package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +0 -1
  313. package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +0 -1
  314. package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +0 -1
  315. package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +0 -1
  316. package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +0 -1
  317. package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +0 -1
  318. package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
  319. package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +0 -1
  320. package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
  321. package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +0 -1
  322. package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +0 -1
  323. package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
  324. package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +0 -1
  325. package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +0 -1
  326. package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
  327. package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +0 -1
  328. package/phanpy/dist/assets/locales/tok-CfheRbCu.js +0 -1
  329. package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +0 -1
  330. package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +0 -1
  331. package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +0 -1
  332. package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +0 -1
  333. package/phanpy/dist/assets/main-BdqNbG-a.js +0 -26
  334. package/phanpy/dist/assets/main-BdqNbG-a.js.map +0 -1
  335. package/phanpy/dist/assets/mock-home-DGhR__He.js +0 -2
  336. package/phanpy/dist/assets/mock-home-DGhR__He.js.map +0 -1
  337. package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
  338. package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
  339. package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
  340. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +0 -2
  341. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +0 -1
  342. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +0 -20
  343. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +0 -1
  344. package/phanpy/dist/assets/style-B1iLPTPR.css +0 -2
  345. package/phanpy/dist/assets/temml-DuyIQMei.js +0 -97
  346. package/phanpy/dist/assets/temml-DuyIQMei.js.map +0 -1
  347. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +0 -2
  348. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
  349. package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
  350. package/phanpy/dist/assets/year-in-posts-DJv_star.js +0 -3
  351. package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +0 -1
  352. package/phanpy/dist/compose/index.html +0 -20
  353. package/phanpy/dist/favicon.ico +0 -0
  354. package/phanpy/dist/index.html +0 -73
  355. package/phanpy/dist/logo-192.png +0 -0
  356. package/phanpy/dist/logo-512.png +0 -0
  357. package/phanpy/dist/logo-badge-72.png +0 -0
  358. package/phanpy/dist/logo-maskable-512.png +0 -0
  359. package/phanpy/dist/logo-monochrome-512.png +0 -0
  360. package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
  361. package/phanpy/dist/manifest.webmanifest +0 -1
  362. package/phanpy/dist/og-image-2.jpg +0 -0
  363. package/phanpy/dist/og-image.png +0 -0
  364. package/phanpy/dist/robots.txt +0 -2
  365. package/phanpy/dist/sw.js +0 -2
  366. package/phanpy/dist/sw.js.map +0 -1
  367. package/phanpy/dist/version.json +0 -1
  368. package/run-agent.mjs +0 -897
  369. package/vendor/gate.cjs +0 -138
  370. package/vendor/idp-grant.cjs +0 -394
  371. package/vendor/jfetch.cjs +0 -16
  372. package/web/admin/actors.js +0 -145
  373. package/web/admin/bar.css +0 -126
  374. package/web/admin/bar.js +0 -99
  375. package/web/admin/client/client.js +0 -66
  376. package/web/admin/client/index.html +0 -69
  377. package/web/admin/client-pick.js +0 -79
  378. package/web/admin/common.js +0 -23
  379. package/web/admin/connections.js +0 -112
  380. package/web/admin/gateway.js +0 -133
  381. package/web/admin/group.js +0 -258
  382. package/web/admin/index.html +0 -603
  383. package/web/admin/notices-bar.js +0 -90
  384. package/web/admin/oauth-signin.mjs +0 -37
  385. package/web/admin/record.js +0 -390
  386. package/web/admin/setup/index.html +0 -241
  387. package/web/admin/setup/setup.js +0 -326
  388. package/web/admin/tokens.css +0 -68
  389. package/web/admin/upkeep.js +0 -177
  390. package/web/admin/window.css +0 -55
  391. package/web/admin/window.js +0 -136
  392. package/web/app/README.md +0 -81
  393. package/web/app/admin-facade.mjs +0 -588
  394. package/web/app/agent.mjs +0 -663
  395. package/web/app/atproto-browser.mjs +0 -86
  396. package/web/app/authorize_interaction.html +0 -56
  397. package/web/app/authorize_interaction.js +0 -69
  398. package/web/app/boot.mjs +0 -576
  399. package/web/app/deliver-relay.mjs +0 -129
  400. package/web/app/dist/boot.js +0 -34218
  401. package/web/app/dist/boot.js.map +0 -7
  402. package/web/app/dist/sw.js +0 -72810
  403. package/web/app/dist/sw.js.map +0 -7
  404. package/web/app/fediacct-browser.mjs +0 -146
  405. package/web/app/gateway-move.mjs +0 -60
  406. package/web/app/idb-kv.mjs +0 -35
  407. package/web/app/index.html +0 -242
  408. package/web/app/keys-browser.mjs +0 -71
  409. package/web/app/keystore.mjs +0 -82
  410. package/web/app/oidc-session.mjs +0 -6
  411. package/web/app/pod-auth.mjs +0 -248
  412. package/web/app/pod-remote.mjs +0 -84
  413. package/web/app/shims/_globals.mjs +0 -2
  414. package/web/app/shims/fedify-sig.mjs +0 -77
  415. package/web/app/shims/node-crypto.mjs +0 -113
  416. package/web/app/shims/node-fs.mjs +0 -17
  417. package/web/app/shims/node-path.mjs +0 -19
  418. package/web/app/shims/node-url.mjs +0 -7
  419. package/web/app/shims/prelude.js +0 -58
  420. package/web/app/shims/safefetch.mjs +0 -58
  421. package/web/app/shims/shapes-text.mjs +0 -8
  422. package/web/app/shims/web-push.mjs +0 -14
  423. package/web/app/signup.mjs +0 -318
  424. package/web/app/sw-src.mjs +0 -220
  425. package/web/app/update.js +0 -70
  426. package/web/front/admin.html +0 -55
  427. package/web/front/admin.js +0 -89
  428. package/web/front/install.sh +0 -69
  429. package/web/front/new-account.html +0 -35
  430. package/web/front/new-account.js +0 -13
  431. package/web/front/notices.html +0 -69
  432. package/web/front/notices.js +0 -107
  433. package/web/front/run.html +0 -58
  434. package/web/front/run.js +0 -195
  435. package/web/front/solid-oidc-client.js +0 -6
  436. package/web/icons/forum.svg +0 -11
  437. package/web/icons/gateway.svg +0 -14
  438. package/web/icons/local.svg +0 -11
@@ -1,603 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>FediPod — record</title>
7
- <link rel="icon" href="/icons/local.svg" type="image/svg+xml">
8
- <link rel="stylesheet" href="tokens.css">
9
- <style>
10
- /* Colours are the shared tokens (tokens.css, the front's palette), so the
11
- record, the front and the bar are one visual system; only the layout root —
12
- the base scale and the bar's column — stays here. Controls share one look: a
13
- field is a light well with a drawn chevron, a button is the front's filled
14
- green. */
15
- :root { color-scheme: light dark; font-size: 125%; --bar-col: 1280px; }
16
- /* The page itself never scrolls: the body is exactly the window; the content
17
- column beside the rail is the scroll container. */
18
- html { height: 100%; }
19
- body { font: 1rem/1.5 Arial, Helvetica, sans-serif; margin: 0; height: 100dvh;
20
- box-sizing: border-box; display: flex; flex-direction: column; overflow: hidden; }
21
- /* The bar spans the window; the rail and the content column share one centred
22
- column underneath it — wide enough that the content keeps 960 of its own
23
- beside the expanded rail. */
24
- #page { flex: 1 1 auto; min-height: 0; width: 100%; max-width: 1280px; margin: 0 auto;
25
- padding: 1.25rem 1rem 1rem; box-sizing: border-box;
26
- display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1.25rem; }
27
- #content { min-width: 0; min-height: 0; overflow-y: auto; }
28
- /* Two cases where the page may grow past the window: the new-account form, and
29
- a group console, whose lists have no bound. Both scroll on the window. */
30
- body.adding, body.group { height: auto; min-height: 100dvh; overflow: auto; }
31
- body.adding #page { display: block; }
32
- body.adding #content, body.group #content { overflow: visible; min-height: auto; }
33
- body.group #page { min-height: auto; }
34
- body.adding #rail { display: none; }
35
- /* The action rail: a raised card of everything you can DO, so the facts keep
36
- the page. Collapsed it is a slim strip holding only the toggle arrow. */
37
- #rail { width: 14.5rem; box-sizing: border-box; padding: .6rem .8rem .9rem;
38
- align-self: start; max-height: 100%; overflow-y: auto;
39
- background: var(--raised); border-radius: .5rem; }
40
- #rail.closed { width: auto; padding: .4rem; }
41
- #rail.closed .rail-groups { display: none; }
42
- #rail-toggle { display: flex; align-items: center; justify-content: flex-end;
43
- width: 100%; margin: 0; padding: .2rem .3rem; border: 0;
44
- background: none; font: inherit; font-weight: 600; color: var(--heading);
45
- cursor: pointer; border-radius: .3rem; }
46
- #rail-toggle:hover, #rail-toggle:active { background: none; }
47
- .rail-arrow { color: var(--link); }
48
- .rail-group h2 { display: block; font-size: .9rem; font-weight: 600;
49
- text-transform: uppercase; letter-spacing: .06em; margin: .9rem 0 .35rem; }
50
- .rail-group button { display: block; width: 100%; text-align: left;
51
- margin: .35rem 0; font-size: .95rem; padding: .35rem .7rem; font-weight: 400; }
52
- .rail-group .apart { margin-top: 1rem; }
53
- /* One column on a phone: the rail becomes a strip of pills above the facts. */
54
- @media (max-width: 47rem) {
55
- #page { display: flex; flex-direction: column; gap: .9rem; }
56
- #rail { width: auto; max-height: none; overflow: visible; }
57
- .rail-group { display: flex; flex-wrap: wrap; align-items: baseline; gap: .1rem .45rem; }
58
- .rail-group h2 { flex: 0 0 100%; margin: .5rem 0 .1rem; }
59
- .rail-group button { display: inline-block; width: auto; margin: .2rem 0; }
60
- #content { flex: 1 1 auto; }
61
- }
62
- /* `hidden` is a UA rule, so ANY author `display` beats it — `dl { display: grid }`
63
- left the facts on screen with the attribute set. Everything here toggles with
64
- `hidden`, so it has to outrank them all. */
65
- [hidden] { display: none !important; }
66
- /* The two status regions are never `hidden`: a live region put into the
67
- accessibility tree in the same task as its text does not reliably announce,
68
- so they stay in it and disappear by being empty instead. */
69
- #say:empty, #fatal:empty { display: none; }
70
- h1, h2, h3 { color: var(--heading); }
71
- a { color: var(--link); }
72
- h2, h3 { font-size: 1.15rem; font-weight: 600; display: flex; flex-wrap: wrap;
73
- align-items: baseline; gap: .6rem; }
74
- h2 { margin: 1.5rem 0 .5rem; }
75
- h3 { margin: 1.25rem 0 .35rem; }
76
- #facts { margin: .75rem 0 0; }
77
- /* They sit after the kind, on that row, so they need a gap from the word and
78
- must not stretch the row's line height. */
79
- #moderation { margin-left: .6rem; word-break: normal; }
80
- #moderation label { display: inline; margin: 0 .3rem 0 .5rem; font-weight: normal; color: var(--muted); }
81
- p { margin: .5rem 0; }
82
- .sub { color: var(--muted); margin-top: 0; }
83
- fieldset { border: 1px solid var(--line); border-radius: .4rem; margin: 1rem 0; padding: .75rem 1rem 1rem; }
84
- legend { padding: 0 .3rem; font-weight: 600; color: var(--heading); }
85
- label { display: block; margin: .75rem 0 .2rem; }
86
- .hint { color: var(--muted); font-size: 1rem; margin: .15rem 0 0; }
87
- .choice input[type=text] { width: 9ch; display: inline-block; padding: .15rem .3rem; }
88
- /* SETTINGS: light wells, unmistakably fields, in both schemes. */
89
- input[type=text], input[type=email], input[type=url], input[type=password], textarea {
90
- font: inherit; width: 100%; padding: .5rem; box-sizing: border-box;
91
- border: 1px solid var(--field-edge); border-radius: .3rem;
92
- background: var(--field-bg); color: var(--ink); }
93
- input::placeholder { color: var(--muted); opacity: 1; }
94
- select { font: inherit; appearance: none; max-width: 100%; min-width: 0;
95
- padding: .15rem 1.7rem .15rem .55rem;
96
- border: 1px solid var(--field-edge); border-radius: .3rem;
97
- color: var(--ink); cursor: pointer;
98
- background-color: var(--field-bg); background-image: var(--chevron);
99
- background-repeat: no-repeat; background-position: right .55rem center;
100
- background-size: .6rem auto; }
101
- select:hover { background-color: var(--field-bg-hover); }
102
- /* ACTIONS: the front's filled-green button, one look for the whole page,
103
- Retire included — the typed-handle confirm, not a colour, is what guards the
104
- destructive ones. */
105
- button { font: inherit; padding: .45rem 1rem; border-radius: .3rem; border: 1px solid var(--btn);
106
- background: var(--btn); color: var(--btn-text); cursor: pointer; }
107
- button:hover, button:active { background: var(--btn-hover); border-color: var(--btn-hover); }
108
- button.primary { font-weight: 600; }
109
- button:disabled { opacity: .55; cursor: default; }
110
- /* Small buttons that sit in a line of text. */
111
- button.inline { font-size: .9rem; padding: .15rem .6rem; font-weight: 400; }
112
- /* One visible ring for everything focusable. */
113
- :is(button, select, input, textarea, a):focus-visible {
114
- outline: 2px solid var(--ring); outline-offset: 2px; }
115
- dl { margin: .5rem 0; } /* grid only above 34rem — see the media query below */
116
- @media (min-width: 34rem) {
117
- dl { display: grid; grid-template-columns: max-content minmax(0, 1fr);
118
- gap: .6rem .9rem; align-items: baseline; }
119
- }
120
- dt { color: var(--muted); }
121
- /* An identity connected under "Other identities" belongs to the row above it,
122
- and the indent is what says so. */
123
- dt.under { padding-left: 1.25rem; }
124
- dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
125
- .rows { list-style: none; padding: 0; margin: .3rem 0; }
126
- .rows li { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
127
- padding: .4rem 0; border-top: 1px solid var(--line); }
128
- .rows li span { flex: 1 1 18rem; overflow-wrap: anywhere; }
129
- .muted { color: var(--muted); }
130
- /* The actors dropdown rides the bar, at the bar's own text scale. */
131
- #bar select { font-size: .95rem; }
132
- /* The per-account Options disclosure: only where storage is not a real choice
133
- (the Node agent's Bluesky, cross-post instead) — a summary opening
134
- Show/Hide in Feed, Cross-post On/Off, Connected/Disconnect. Where storage
135
- IS a choice, two dropdowns sit in the row directly instead (admin.js
136
- connectionControls). */
137
- details.opts { display: inline-block; }
138
- details.opts > summary { cursor: pointer; color: var(--link); list-style: none; }
139
- details.opts > summary::-webkit-details-marker { display: none; }
140
- details.opts > summary::after { content: ' \25be'; }
141
- details.opts[open] > summary::after { content: ' \25b4'; }
142
- details.opts > div { margin: .4rem 0 .2rem; padding: .5rem .6rem; display: flex; flex-direction: column;
143
- gap: .4rem; align-items: stretch; border: 1px solid var(--line); border-radius: .3rem;
144
- background: var(--raised); min-width: 11rem; }
145
- details.opts > div select { width: 100%; }
146
- .opt-hint { color: var(--muted); font-size: .9rem; margin: -.1rem 0 .1rem; }
147
- /* The connection and storage dropdowns that sit in the row itself (admin.js
148
- connectionControls) — extra room from the account name before them. */
149
- .conn-controls { display: inline-flex; align-items: center; gap: .4rem; margin-left: 1rem; }
150
- /* The alias row inside the Transfer-an-account-here panel. */
151
- #alias-ctl { display: flex; gap: .5rem; align-items: center; margin-top: .3rem; }
152
- #alias-ctl input { flex: 1 1 12rem; width: auto; }
153
- #alias-chips span { display: inline-flex; align-items: center; gap: .35rem;
154
- border: 1px solid var(--btn-edge); border-radius: 999px;
155
- padding: .05rem .25rem .05rem .75rem; margin: 0 .3rem .3rem 0; }
156
- /* Radios read as one line each: label { display: block } alone drops the text
157
- below the control. */
158
- .choice { display: block; margin: .35rem 0; font-weight: normal; }
159
- .choice input { width: auto; margin-right: .4rem; }
160
- .warn { border-left: .25rem solid var(--warn); padding-left: .75rem; }
161
- .err { border-left: .25rem solid var(--danger); padding-left: .75rem; color: var(--danger); }
162
- .ok { border-left: .25rem solid var(--ok); padding-left: .75rem; }
163
- pre { overflow-x: auto; background: #0001; padding: .6rem; border-radius: .3rem; font-size: .9rem; }
164
- @media (prefers-color-scheme: dark) {
165
- fieldset { border-color: #555; } .rows li { border-color: #444; }
166
- }
167
- </style>
168
- <link rel="stylesheet" href="bar.css?v=4">
169
- <link rel="stylesheet" href="window.css">
170
- </head>
171
- <body>
172
-
173
- <!-- The same bar the client view carries: one thing, two views. -->
174
- <nav id="bar" aria-label="Site">
175
- <h1 class="name">FediPod</h1>
176
- <select id="actor-pick" aria-label="Local actors"
177
- title=" Every actor on this machine; choosing one goes to its record"></select>
178
- <!-- The account group, styled like the client group beside it: one label,
179
- then the places to go. The browser build adds "sign out" to it. -->
180
- <span id="account-pick"><span id="account-now">account:</span>
181
- <a id="bar-fediverse" href="client/" title=" Open the client and read your timeline">visit</a>
182
- <a id="bar-manage" href="./" title=" The record: what this actor is, and what you can do to it" aria-current="page">manage</a>
183
- </span>
184
- <!-- Notices from whoever runs this site. Shown only when the site has any
185
- (notices-bar.js asks /api/notices); the count is how many are new here. -->
186
- <button type="button" id="bar-notices" hidden aria-haspopup="dialog" aria-controls="notices-list"
187
- title=" Notices from the operator of this site">&#128276;<span id="bar-notices-count" aria-live="polite"></span></button>
188
- </nav>
189
- <main id="page">
190
-
191
- <!-- Everything you can DO, in one collapsible card; the facts keep the page.
192
- The buttons are the same ones the two action rows used to hold — same
193
- ids, same floating panels. -->
194
- <nav id="rail" hidden aria-label="Actions">
195
- <button type="button" id="rail-toggle" aria-expanded="true" aria-label="Actions"
196
- title=" Hide the action panel"><span class="rail-arrow" aria-hidden="true">«</span></button>
197
- <div class="rail-groups">
198
- <section class="rail-group" aria-label="Upkeep">
199
- <h2>Upkeep</h2>
200
- <button id="do-drain" title=" Fetch and handle whatever is waiting in the inbox now">Drain the inbox</button>
201
- <button id="do-rebuild" title=" Put back posts this machine lost, from what the pod still holds">Recover posts</button>
202
- <button id="do-log" title=" This agent's recent log lines">Show the log</button>
203
- <button id="do-deadletter" title=" Deliveries that failed for good and were set aside">Show dead letters</button>
204
- </section>
205
- <section class="rail-group" aria-label="Lifecycle">
206
- <h2>Lifecycle</h2>
207
- <button id="do-rotate-key" title=" Replace the signing key and tell other servers the new one" data-confirm="rotate-key">Rotate signing key</button>
208
- <button id="do-transfer-in" title=" List an old account as an alias, so its server sends its followers here">Transfer an account here</button>
209
- <button id="do-move" title=" Your followers go to the account you name; this handle keeps resolving as a redirect" data-confirm="move">Transfer this account away</button>
210
- <button id="do-retire" title=" End this identity for good — a Delete, then a Tombstone" class="danger apart" data-confirm="retire">Retire identity</button>
211
- </section>
212
- </div>
213
- </nav>
214
-
215
- <div id="content">
216
- <p class="err" id="fatal" role="alert"></p>
217
- <p aria-live="polite" id="say"></p>
218
-
219
- <!-- Every actor running on this machine. A stopped one is left out: there is
220
- no page there to open. Plain links — a top-level navigation sends no
221
- Origin, so each agent's own firewall lets it through. -->
222
- <section id="pane-others" aria-label="Actors on this machine" hidden>
223
- <!-- Everything setup cannot work without. The bio, avatar and UI password it
224
- also offers are all changeable afterwards, so they are not asked here —
225
- the fuller form is what the new actor opens on. -->
226
- <form id="new-actor-form" hidden>
227
- <fieldset>
228
- <legend>What kind of Actor?</legend>
229
- <label class="choice"><input type="radio" name="newKind" value="person" checked>
230
- A <strong>person</strong> — an account you read and post from</label>
231
- <label class="choice"><input type="radio" name="newKind" value="group">
232
- A <strong>group</strong> of Fediverse users you manage</label>
233
- </fieldset>
234
-
235
- <fieldset>
236
- <legend>Actor's Handle</legend>
237
- <label for="new-handle">Handle</label>
238
- <input type="text" id="new-handle" autocomplete="off"
239
- placeholder="handle part of Fediverse address: @HANDLE@server"
240
- aria-describedby="new-handle-hint">
241
- <p class="hint" id="new-handle-hint">The name in your Fediverse address. This is permanent.
242
- Letters, digits, hyphens, and underscores only.</p>
243
- </fieldset>
244
-
245
- <fieldset>
246
- <legend>Actor's Pod</legend>
247
- <label class="choice"><input type="radio" name="newMode" value="new" checked>
248
- Create a Solid account and pod for the Actor</label>
249
- <label class="choice"><input type="radio" name="newMode" value="existing">
250
- Use a pod I already have</label>
251
-
252
- <label for="new-issuer">Solid identity provider</label>
253
- <input type="url" id="new-issuer" value="https://solidcommunity.net" autocomplete="url">
254
-
255
- <label for="new-email">Solid Account email/username</label>
256
- <input type="email" id="new-email" autocomplete="email" placeholder="you@example.org">
257
-
258
- <label for="new-password">Solid Account password</label>
259
- <input type="password" id="new-password" autocomplete="current-password"
260
- aria-describedby="new-password-hint">
261
- <p class="hint" id="new-password-hint">Password is sent once in return for a credential which is stored locally.
262
- The password itself is never stored. You may revoke the credential without changing the
263
- password.</p>
264
-
265
- <div id="new-row-podname">
266
- <label for="new-podname">Pod name</label>
267
- <input type="text" id="new-podname" autocomplete="off" aria-describedby="new-podname-hint">
268
- <p class="hint" id="new-podname-hint">The subdomain of your pod address, it will become
269
- https://YOUR-POD-NAME.your-identity-provider</p>
270
- </div>
271
- <div id="new-row-pod" hidden>
272
- <label for="new-pod">Pod address</label>
273
- <input type="url" id="new-pod" autocomplete="url" placeholder="https://you.solidcommunity.net/">
274
- </div>
275
- </fieldset>
276
-
277
- <p>
278
- <button type="submit" id="new-actor-go" title=" Create the account, the pod and the actor" class="primary">Create</button>
279
- <button type="button" id="new-actor-cancel" title=" Change nothing and close">Cancel</button>
280
- </p>
281
- </form>
282
-
283
- </section>
284
-
285
- <section id="pane-identity" hidden>
286
- <dl id="facts"></dl>
287
- <!-- State documents the agent could not read on its last load, if any. -->
288
- <p class="err" id="state-skipped" role="alert" hidden></p>
289
- <!-- Declared here, and render() puts these on the kind row — the row they
290
- belong to is generated, so this is the only place they can be written
291
- down. Each reads as the setting it would change, so what it shows IS the
292
- current state: changing the word is the whole action, with no save. -->
293
- <span id="moderation" hidden>
294
- <label for="joins-mod">join requests</label>
295
- <select id="joins-mod" title=" Whether each join request waits for you">
296
- <option value="unmoderated">unmoderated</option>
297
- <option value="moderated">moderated</option>
298
- </select>
299
- <label for="review-mod">posts</label>
300
- <select id="review-mod" title=" Whether members’ posts wait for you">
301
- <option value="unmoderated">unmoderated</option>
302
- <option value="moderated">moderated</option>
303
- </select>
304
- </span>
305
- <span id="status-ctl" hidden>
306
- <select id="status-pick" aria-label="Actor status" title=" Whether this actor is receiving mail — parking stops it and keeps the handle; active re-follows the saved graph">
307
- <option value="active">active</option>
308
- <option value="parked">parked</option>
309
- </select>
310
- </span>
311
- <span id="update-ctl" hidden>
312
- <span id="update-word"></span>
313
- <button id="update-go" hidden title=" Pull the latest FediPod and restart every agent on this machine">Update</button>
314
- </span>
315
- <span id="follows-ctl" hidden>
316
- <select id="follows-pick" aria-label="New followers" title=" Whether each new follower waits for you — switch to accepted automatically before moving an old account here, so the whole wave lands">
317
- <option value="approve">wait for approval</option>
318
- <option value="auto">accepted automatically</option>
319
- </select>
320
- </span>
321
- <span id="ident-ctl" hidden>
322
- <button type="button" id="ident-open" class="inline" title=" Connect an account you hold on another network, so its timeline joins the one you read here">Connect an identity</button>
323
- </span>
324
- </section>
325
-
326
- <span id="gateway-ctl" hidden>
327
- <span id="gateway-word"></span>
328
- <button type="button" id="gateway-open-attach" class="inline" hidden
329
- title=" Attach this account to a mail-filtering gateway">Attach to a gateway</button>
330
- <button type="button" id="gateway-open-detach" class="inline danger" hidden
331
- title=" Go back to your pod's own inbox">Detach from gateway</button>
332
- <!-- Shown only when the agent reports the account's standing at the gateway
333
- (the browser build does; a DeviceAgent's admin does not). -->
334
- <button type="button" id="gateway-pause" class="inline" hidden
335
- title=" Stop keeping the posts sent to you until you resume; follows still arrive">Pause my account</button>
336
- <button type="button" id="gateway-resume" class="inline" hidden
337
- title=" Keep the posts sent to you again">Resume my account</button>
338
- <button type="button" id="gateway-close" class="inline danger" hidden data-confirm="close-address"
339
- title=" Close your address at this gateway for good; nothing on your pod is touched">Close this address</button>
340
- </span>
341
-
342
- <section id="pane-group" hidden>
343
- <!-- Both queues are consequences of a moderation setting: with the setting off
344
- nothing can ever arrive in them, so the heading would be a standing
345
- promise of a list that cannot fill. Shown only when the setting is on AND
346
- something is waiting. -->
347
- <div id="block-requests" hidden>
348
- <h3>Follow requests <span class="muted" id="requests-count"></span>
349
- <button id="admit-all" class="inline" title=" Accept everyone waiting, in one go">Accept all</button></h3>
350
- <ul class="rows" role="list" id="requests"></ul>
351
- </div>
352
-
353
- <div id="block-pending" hidden>
354
- <h3>Posts to review <span class="muted" id="pending-count"></span></h3>
355
- <ul class="rows" role="list" id="pending"></ul>
356
- </div>
357
-
358
- <!-- Moderation another server asked for. A delivery does not prove who sent
359
- it, so a moderator's request waits to be vouched for rather than acting
360
- on arrival. Shown only when something is actually waiting. -->
361
- <div id="block-modqueue" hidden>
362
- <h3>Moderation requests <span class="muted" id="modqueue-count"></span></h3>
363
- <p class="hint">Asked for by a moderator over the Fediverse. A delivery cannot prove who
364
- sent it, so nothing here has been acted on.</p>
365
- <ul class="rows" role="list" id="modqueue"></ul>
366
- </div>
367
-
368
- <h3>Members <span class="muted" id="members-count"></span></h3>
369
- <p class="hint">A group cannot force an unfollow. Muting is declining to carry; ejecting also
370
- tells their server it is no longer a member.</p>
371
- <ul class="rows" role="list" id="members"></ul>
372
-
373
- <h3>Carried <span class="muted" id="announced-count"></span></h3>
374
- <ul class="rows" role="list" id="announced"></ul>
375
- </section>
376
-
377
- <section id="pane-inbox" hidden>
378
- <h2><span class="hlabel">Inbox</span></h2>
379
- <p id="inbox-summary"></p>
380
- <p class="hint">Your pod accepts deliveries whether or not this agent is running, so a
381
- machine that has been off collects them. The agent is working through them oldest first
382
- and will get there on its own — this is only here if you would rather not wait.</p>
383
- <p>
384
- <button id="inbox-keep" title=" Keep everything and let the agent work through it">Keep everything</button>
385
- <label for="inbox-before">or discard content older than</label>
386
- <select id="inbox-before">
387
- <option value="7">7 days</option>
388
- <option value="30" selected>30 days</option>
389
- <option value="90">90 days</option>
390
- </select>
391
- <button id="inbox-prune" title=" Discard content older than the chosen age; keep the bookkeeping" class="primary">Discard it</button>
392
- </p>
393
- <p class="hint">Discarding drops posts, not bookkeeping: follows, unfollows, acceptances
394
- and deletions in that period are still applied, so your follower list stays right and
395
- nothing stays up that its author took down. What goes is the timeline you would have
396
- read that week.</p>
397
- <p class="err" id="inbox-warn" hidden></p>
398
- </section>
399
-
400
- <!-- Every form and panel is DECLARED here, inside the window that shows them.
401
- Nothing is built in script — window.js only unhides one at a time, moves
402
- the window and closes it. It floats rather than opening at the foot of the
403
- page, so it never pushes the line you are reading out from under you. -->
404
- <div id="win" hidden>
405
- <div id="win-bar"><span id="win-title"></span><button type="button" id="win-close" title=" Close this panel" aria-label="Close panel">✕</button></div>
406
- <div id="win-body">
407
- <pre id="output" tabindex="0" role="region" aria-label="Output" hidden></pre>
408
- <!-- The inbound half of transferring: the aliases its old server checks before
409
- it will send the Move. The outbound half is its own panel (confirm-form,
410
- warn-move) — additive and reversible here, followers handed away there,
411
- so the two directions never share a door. -->
412
- <div id="transfer-in-form" hidden>
413
- <p class="hint">List the old account here first — its server checks this list before it
414
- will send the move. Then start the transfer from the old account's own settings, and
415
- set new followers to "accepted automatically" so the whole wave lands.</p>
416
- <p id="alias-chips"></p>
417
- <span id="alias-ctl">
418
- <input type="text" id="alias-input" placeholder="@you@old.server" autocomplete="off"
419
- title=" The account you are moving here from; its server checks this list before it will send the Move">
420
- <button type="button" id="alias-add" class="inline"
421
- title=" Resolve the old account, list it in alsoKnownAs, and republish the actor">Add alias</button>
422
- </span>
423
- </div>
424
- <form id="bsky-form" hidden>
425
- <ol class="hint">
426
- <li>Get an account on Bluesky or another ATProto server.</li>
427
- <li>On Bluesky, make an app password (Settings → Privacy and security → App Passwords)
428
- and copy it — it is shown only once.</li>
429
- <li>Fill in this form to connect, pasting that app password into the password
430
- field.</li>
431
- </ol>
432
- <label for="bsky-service">service</label>
433
- <input type="url" id="bsky-service" value="https://bsky.social" autocomplete="off">
434
- <label for="bsky-identifier">handle</label>
435
- <input type="text" id="bsky-identifier" placeholder="you.bsky.social" autocomplete="username">
436
- <label for="bsky-password">app password</label>
437
- <input id="bsky-password" type="password" autocomplete="current-password">
438
- <p>
439
- <button id="bsky-connect" type="submit" class="primary" title=" Sign in to the Bluesky account with the app password">Connect</button>
440
- </p>
441
- </form>
442
- <form id="ident-form" hidden>
443
- <p class="hint">Either kind brings that account's timeline and notifications
444
- into the feed you read here, and acts as that account when you reply to,
445
- favourite or boost one of its posts.</p>
446
- <p>
447
- <button type="button" id="ident-pick-fedi" class="primary" title=" Sign in at a Mastodon-API server: Mastodon, GoToSocial, Pleroma, Akkoma, Pixelfed or Friendica">A Fediverse account</button>
448
- <button type="button" id="ident-pick-bsky" title=" Sign in to Bluesky or another ATProto server with an app password">A Bluesky account</button>
449
- </p>
450
- </form>
451
- <form id="fediacct-form" hidden>
452
- <ol class="hint">
453
- <li>Name the server your other account is on.</li>
454
- <li>That server asks you to sign in and to allow FediPod. It is the only
455
- place your password is typed; this agent never sees or stores one.</li>
456
- <li>Its timeline and notifications then join the ones you already read here,
457
- and a like or a reply on one of its posts goes out as that account.</li>
458
- <li>What arrives is held on this machine for reading. None of it is written
459
- to your pod.</li>
460
- </ol>
461
- <label for="fediacct-host">server</label>
462
- <input type="text" id="fediacct-host" placeholder="mastodon.social" autocomplete="off"
463
- title=" The server your other account lives on — Mastodon, GoToSocial, Pleroma, Akkoma, Pixelfed and Friendica all speak the API this needs">
464
- <p>
465
- <button id="fediacct-connect" type="submit" class="primary" title=" Go to that server to sign in and allow FediPod">Continue to that server</button>
466
- </p>
467
- </form>
468
- <!-- Every consequence is written here rather than assembled in script: the
469
- page asking "are you sure" has to say what it is sure about, and this is
470
- the only record of it. Script picks which block to show, nothing else. -->
471
- <!-- The gateway popups: attach proves the pod with this agent's own credential;
472
- detach republishes the pod's own inbox. -->
473
- <form id="gateway-attach-form" hidden>
474
- <p class="hint">A gateway filters your Fediverse mail before it reaches your pod: each
475
- delivery is verified at its door, spam is dropped, and the rest lands in your pod as
476
- before. Attaching proves the pod with this agent's own credential — no password
477
- leaves this machine.</p>
478
- <label for="gw-front">gateway</label>
479
- <input type="url" id="gw-front" placeholder="https://fedipod.net" autocomplete="off">
480
- <fieldset>
481
- <legend>Your Fediverse handle</legend>
482
- <label class="choice"><input type="radio" name="gwShape" value="pod" checked>
483
- Keep my pod-based handle: <strong id="gw-pod-preview"></strong><br>
484
- <span class="hint">Your address stays tied to your own pod — you can drop the
485
- gateway any time and keep everything.</span></label>
486
- <label class="choice" id="gw-shape-front"><input type="radio" name="gwShape" value="front">
487
- Create a handle at the gateway:
488
- @<input type="text" id="gw-name" placeholder="name" autocomplete="off"
489
- autocapitalize="off" spellcheck="false">@<span id="gw-front-host">fedipod.net</span><br>
490
- <span class="hint">Your address lives on the gateway's domain, but not your data
491
- or key; you can change pods later and keep the handle.</span>
492
- <span id="gw-name-msg" class="hint"></span></label>
493
- </fieldset>
494
- <p>
495
- <button id="gw-attach" type="button" class="primary"
496
- title=" Create the gateway account and point your mail through its door">Attach</button>
497
- </p>
498
- </form>
499
- <form id="gateway-detach-form" hidden>
500
- <p class="hint" id="gw-detach-plain">Deliveries go back to your pod's own inbox — the
501
- actor is republished advertising it. Your name and data never moved.</p>
502
- <p class="warn" id="gw-detach-fronted" hidden>This identity publishes under the gateway's
503
- name. Detaching moves every published id back to the pod — a rename other servers
504
- see, not just a mail change.</p>
505
- <!-- Browser build only: stage-site.mjs renames this id to gw-move-hint-browser,
506
- and gateway.js shows it for an address that lives at a gateway. The
507
- DeviceAgent has no move-in yet, so here it stays hidden under this id. -->
508
- <p class="hint" id="gw-move-hint" hidden>To move this address to another gateway, open that
509
- gateway, choose “create an account”, and sign in with this pod. Your posts, followers and
510
- key come with you, and your followers are told the new address.</p>
511
- <p>
512
- <button id="gw-detach" type="button" class="primary"
513
- title=" Forget the gateway and republish the actor with the pod inbox">Detach</button>
514
- </p>
515
- </form>
516
- <form id="confirm-form" hidden>
517
- <div id="warn-rotate-key" class="warn" hidden>
518
- <p>A new keypair replaces the one in this home and the actor is republished so other
519
- servers learn it. Any other device still holding the old key stops being able to sign.</p>
520
- </div>
521
- <div id="warn-retire" class="warn" hidden>
522
- <p><strong>This cannot be undone.</strong> A Delete goes to every follower's inbox telling
523
- those servers to drop the account and the posts they cached, the actor document is
524
- replaced with a Tombstone, and this agent will refuse to start again for this pod. Your
525
- posts and RDF stay on the pod; the identity does not come back.</p>
526
- <p>Two things that are not this, and can be done from here:
527
- <button type="button" id="go-park" title=" Park instead: keeps the handle, just stops the mail" class="inline">Park it instead</button>
528
- keeps the handle resolving and just stops the mail — setting status back to
529
- active undoes it.
530
- <button type="button" id="go-move" title=" Transfer instead: hands your followers to another account" class="inline">Transfer it instead</button>
531
- hands your followers to another account.</p>
532
- <label for="confirm-handle">Type the handle to confirm</label>
533
- <input type="text" id="confirm-handle" autocomplete="off">
534
- </div>
535
- <div id="warn-close-address" class="warn" hidden>
536
- <p><strong>This cannot be undone.</strong> Your address at the gateway is closed for good:
537
- mail to it is turned away, other servers drop the account the next time they look, and
538
- nobody can take the name. Nothing on your pod is touched — your posts, key and data stay
539
- where they are.</p>
540
- <label for="confirm-handle-close">Type the handle to confirm</label>
541
- <input type="text" id="confirm-handle-close" autocomplete="off">
542
- </div>
543
- <!-- "Move private data" (POST /state-move) had a panel here and no way to
544
- open it: nothing in this page has ever carried data-confirm="move-state",
545
- so the panel was only ever hidden. Removed 2026-09-09 rather than left as
546
- markup that looks like a feature. The route is still there for the CLI,
547
- which is where moving the private half between a directory and the pod
548
- belongs — it is about filesystem paths and credential.json, neither of
549
- which a browser has. -->
550
- <div id="warn-move" class="warn" hidden>
551
- <p>A <code>Move</code> goes to every follower's inbox and their servers migrate them to the
552
- account you name, so they end up following that one instead. The actor left behind
553
- advertises <code>movedTo</code>, so this handle keeps resolving as a redirect rather than
554
- breaking — nothing here is deleted.</p>
555
- <p>Then this identity is parked, exactly as Park would: everyone it follows is unfollowed
556
- and the inbox is closed. Migrating is the far end's decision, so some followers will not
557
- come across.</p>
558
- <label for="move-target">Transfer to</label>
559
- <input type="text" id="move-target" autocomplete="off" placeholder="@you@elsewhere or an actor URL">
560
- <label for="confirm-handle-move">Type this actor's handle to confirm</label>
561
- <input type="text" id="confirm-handle-move" autocomplete="off">
562
- </div>
563
- <p>
564
- <button type="submit" id="confirm-go" title=" Do it" class="primary">Confirm</button>
565
- <button type="button" id="confirm-cancel" title=" Change nothing and close">Cancel</button>
566
- </p>
567
- </form>
568
- </div>
569
- </div>
570
-
571
- </div>
572
- </main>
573
-
574
- <script src="bar.js"></script>
575
- <script src="window.js"></script>
576
- <script src="common.js"></script>
577
- <script src="record.js"></script>
578
- <script src="actors.js"></script>
579
- <script src="connections.js"></script>
580
- <script src="group.js"></script>
581
- <script src="upkeep.js"></script>
582
- <script src="gateway.js"></script>
583
-
584
- <!-- The notices: the list, and one notice open. Declared here and filled by
585
- notices-bar.js from /api/notices; nothing in them is markup from a notice. -->
586
- <dialog id="notices-list" aria-labelledby="notices-title">
587
- <section>
588
- <h2 id="notices-title">Notices</h2>
589
- <ul id="notices-items"></ul>
590
- <p class="row"><button type="button" id="notices-close" class="primary" title=" Close the list of notices">Close</button></p>
591
- </section>
592
- </dialog>
593
- <dialog id="notice-view" aria-labelledby="notice-view-title">
594
- <section>
595
- <h2 id="notice-view-title"></h2>
596
- <p class="when" id="notice-view-when"></p>
597
- <div id="notice-view-body"></div>
598
- <p class="row"><button type="button" id="notice-view-close" class="primary" title=" Back to the list of notices">Close</button></p>
599
- </section>
600
- </dialog>
601
- <script src="notices-bar.js"></script>
602
- </body>
603
- </html>