d9f26beac5
Key upstream changes merged: - Settings admin page (ap_settings collection, GET/POST controller, Nunjucks template) - ObjectId-based status IDs (fixes same-second collision bug in cursor pagination) - Status edit history stored in ap_status_edits, GET /statuses/:id/history endpoint - Keyword filters for Mastodon API timelines (apply-filters.js middleware) - resolve-reply-ids.js helper for threading - Filter replies from public/local/hashtag timelines - Non-expiring access tokens - Media upload improvements (express-fileupload, bridge IndieAuth token) - Startup gate: defer background tasks until host readiness signal - Own posts exempt from timeline retention cleanup - Various Mastodon API fixes (account IDs, update_credentials, interactions) Conflict resolutions: - pagination.js: adopted upstream's ObjectId approach (removed cursor-based encodeCursor/decodeCursor) - statuses.js: adopted upstream's PUT rewrite (cleaner ownership check, edit history storage via Micropub fetch); kept GET /statuses/:id with pinnedIds/replyIdMap; adopted ObjectId-only findTimelineItemById - compose.js: kept our isDirect/senderActorUrl (DM feature) + added upstream's mediaEndpoint - activitypub-compose.njk: kept DM notice block + added enctype="multipart/form-data" - Removed unused processStatusContent function and Update import from statuses.js Fork-specific changes preserved: - allowPrivateAddress: true in federation-setup.js - Canonical Like activity IDs + Like dispatcher in federation-setup.js - Repost commentary in jf2-to-as2.js - /api/ap-url endpoint in index.js - Direct Follow workaround for tags.pub Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>