>>> ktistec: Building community/ktistec 3.2.0-r0 (using abuild 3.16.0_rc4-r0) started Thu, 13 Nov 2025 23:10:03 +0000 >>> ktistec: Validating /home/buildozer/aports/community/ktistec/APKBUILD... >>> ktistec: Analyzing dependencies... >>> ktistec: Installing for build: build-base tzdata gc-dev git gmp-dev libxml2-dev musl-utils openssl-dev pcre2-dev sqlite-dev yaml-dev zlib-dev ( 1/30) Installing tzdata (2025b-r0) ( 2/30) Installing gc (8.2.8-r1) ( 3/30) Installing libgc++ (8.2.8-r1) ( 4/30) Installing gc-dev (8.2.8-r1) ( 5/30) Installing libgmpxx (6.3.0-r4) ( 6/30) Installing gmp-dev (6.3.0-r4) ( 7/30) Installing zlib-dev (1.3.1-r2) ( 8/30) Installing xz-libs (5.8.1-r0) ( 9/30) Installing xz (5.8.1-r0) (10/30) Installing xz-dev (5.8.1-r0) (11/30) Installing libxml2 (2.13.9-r0) (12/30) Installing libxml2-utils (2.13.9-r0) (13/30) Installing libxml2-dev (2.13.9-r0) (14/30) Installing openssl-dev (3.5.4-r0) (15/30) Installing bsd-compat-headers (0.7.2-r6) (16/30) Installing libformw (6.5_p20251010-r0) (17/30) Installing libmenuw (6.5_p20251010-r0) (18/30) Installing libpanelw (6.5_p20251010-r0) (19/30) Installing libncurses++ (6.5_p20251010-r0) (20/30) Installing ncurses-dev (6.5_p20251010-r0) (21/30) Installing libedit-dev (20251016.3.1-r0) (22/30) Installing libpcre2-16 (10.47-r0) (23/30) Installing libpcre2-32 (10.47-r0) (24/30) Installing pcre2-dev (10.47-r0) (25/30) Installing sqlite (3.51.0-r0) (26/30) Installing sqlite-libs (3.51.0-r0) (27/30) Installing sqlite-dev (3.51.0-r0) (28/30) Installing yaml (0.2.5-r2) (29/30) Installing yaml-dev (0.2.5-r2) (30/30) Installing .makedepends-ktistec (20251113.231004) busybox-1.37.0-r25.trigger: Executing script... OK: 452 MiB in 135 packages >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Cleaning up tmpdir >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/ktistec-3.2.0.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) wget: server returned error: HTTP/1.1 404 Not Found >>> ktistec: Fetching ktistec-3.2.0.tar.gz::https://github.com/toddsundsted/ktistec/archive/refs/tags/v3.2.0.tar.gz Connecting to github.com (140.82.121.4:443) Connecting to codeload.github.com (140.82.121.9:443) saving to '/var/cache/distfiles/v3.23/ktistec-3.2.0.tar.gz.part' ktistec-3.2.0.tar.gz 100% |********************************| 6802k 0:00:00 ETA '/var/cache/distfiles/v3.23/ktistec-3.2.0.tar.gz.part' saved /var/cache/distfiles/v3.23/ktistec-3.2.0.tar.gz: OK /home/buildozer/aports/community/ktistec/ktistec.initd: OK /home/buildozer/aports/community/ktistec/ktistec.confd: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-x86_6 1% | | 831k 0:00:50 ETA crystal-1.16.3-x86_6 100% |********************************| 41.5M 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' crystal-1.16.3-aarch 100% |********************************| 38.2M 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz.part' crystal-1.16.3.tar.g 100% |********************************| 3633k 0:00:00 ETA '/var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz.part' saved /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk.part' shards-0.19.1-r0-x86 100% |********************************| 1211k 0:00:00 ETA '/var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk.part' saved /var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk.part' shards-0.19.1-r0-aar 100% |********************************| 1128k 0:00:00 ETA '/var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk.part' saved /var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/ktistec-3.2.0.tar.gz /var/cache/distfiles/v3.23/ktistec-3.2.0.tar.gz: OK /home/buildozer/aports/community/ktistec/ktistec.initd: OK /home/buildozer/aports/community/ktistec/ktistec.confd: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/crystal-1.16.3.tar.gz /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk /var/cache/distfiles/v3.23/shards-0.19.1-r0-x86_64.apk: OK >>> ktistec: Fetching https://distfiles.alpinelinux.org/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk /var/cache/distfiles/v3.23/shards-0.19.1-r0-aarch64.apk: OK >>> ktistec: Unpacking /var/cache/distfiles/v3.23/ktistec-3.2.0.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3-x86_64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3-aarch64-alpine-linux-musl.tar.gz... >>> ktistec: Unpacking /var/cache/distfiles/v3.23/crystal-1.16.3.tar.gz... Extracting ../shards-0.19.1-r0-x86_64.apk... 'usr/bin/shards' -> 'bin/shards' I: Resolving dependencies I: Fetching https://github.com/kemalcr/kemal.git I: Fetching https://github.com/toddsundsted/slang.git I: Fetching https://github.com/crystal-lang/crystal-sqlite3.git I: Fetching https://github.com/toddsundsted/libxml_ext.git I: Fetching https://github.com/toddsundsted/openssl_ext.git I: Fetching https://github.com/toddsundsted/host_meta.git I: Fetching https://github.com/toddsundsted/web_finger.git I: Fetching https://github.com/toddsundsted/school.git I: Fetching https://github.com/icyleaf/markd.git I: Fetching https://gitlab.com/arctic-fox/spectator.git I: Fetching https://github.com/luislavena/radix.git I: Fetching https://github.com/crystal-loot/exception_page.git I: Fetching https://github.com/sija/backtracer.cr.git I: Fetching https://github.com/crystal-lang/crystal-db.git I: Installing radix (0.4.1) I: Installing backtracer (1.2.4) I: Installing exception_page (0.4.1) I: Installing kemal (1.5.0) I: Installing slang (2.0.2) I: Installing db (0.14.0) I: Installing sqlite3 (0.22.0) I: Installing libxml_ext (0.1.2) I: Installing openssl_ext (0.1.6) I: Installing host_meta (0.2.4) I: Installing web_finger (0.2.6) I: Installing school (0.3.1) I: Installing markd (0.5.0) I: Installing spectator (0.12.2) SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0006s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:24:08.090275Z INFO - Updating database statistics: 0.236ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:24:56.346865Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:24:56.360002Z WARN - mcp: method not found: unknown/method 2025-11-13T23:24:56.649934Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:24:57.482120Z INFO - Ktistec is going to take a rest! 2025-11-13T23:25:02.133584Z INFO - Ktistec is going to take a rest! 2025-11-13T23:25:20.229282Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:25:20.242413Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:25:20.256162Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:25:20.269524Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:25:20.282531Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:25:21.036051Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/bjhmorvp published=false 2025-11-13T23:25:21.037253Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/qdblmsrp published=true 2025-11-13T23:25:21.038854Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/xvapujmt published=true 2025-11-13T23:25:21.040062Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/adbucpzy published=false 2025-11-13T23:25:21.040580Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/wuiogrml 2025-11-13T23:25:21.041750Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ksoeibwl 2025-11-13T23:25:21.042916Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/nfspkoyj 2025-11-13T23:25:21.044041Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ytdvcabr 2025-11-13T23:25:21.502697Z NOTICE - database: Slow query [ 441.112ms] -- SELECT "type","id","created_at","updated_at","type","from_iri","to_iri","confirmed","visible" FROM "relationships" WHERE type IN ('Relationship::Content::Inbox','Relationship::Content::Outbox') ORDER BY id 2025-11-13T23:25:21.502810Z NOTICE - database: [{0, "SEARCH relationships USING INDEX idx_relationships_type (type=?)"}, {0, "USE TEMP B-TREE FOR ORDER BY"}] 2025-11-13T23:25:21.582413Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/ovgrhkzs 2025-11-13T23:25:21.598529Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/arisfcbn 2025-11-13T23:25:21.612860Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/mwazhgqf 2025-11-13T23:25:21.630836Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:21.634854Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:21.634856Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:21.634858Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:21.635362Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:21.635364Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:21.636128Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:21.638432Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:21.638434Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:21.638435Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:21.638737Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:21.638739Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:21.638985Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:21.640424Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:21.640426Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.195357Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.197774Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.197776Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.198465Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.200732Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.200734Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.201655Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.203965Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.203967Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.203969Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.204277Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.204279Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.218049Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.220330Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.220332Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.234238Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.236610Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.236612Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.251055Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.253704Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.253706Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.254799Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.257144Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.257146Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.257148Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.257468Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.257470Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.272141Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.274527Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.274529Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.275678Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.278048Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.278050Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.278052Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.278375Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.278376Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.294425Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.296788Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.296790Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.297842Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.300070Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.300072Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.300075Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.300408Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.300409Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.316151Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.318392Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.318394Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.319445Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.321741Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.321743Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.321744Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.322046Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.322048Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.336284Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.338607Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.338609Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.339662Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.341979Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.341981Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.341985Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.342324Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.342325Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.356758Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.359064Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.359066Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.360134Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.362337Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.362339Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:25:22.362341Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:25:22.362639Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.362640Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:25:22.380682Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.382919Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.382921Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.384649Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.386850Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.386852Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:25:22.386856Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:25:22.387723Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:25:22.387725Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:25:22.389837Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.392031Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.392033Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.406744Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.408932Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.408934Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.423180Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.425484Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.425486Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.441606Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.444041Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.444043Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:25:22.820637Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:25:22.824569Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:25:22.824572Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:25:22.824575Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:25:22.849658Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-13T23:25:22.849664Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:25:22.873620Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-13T23:25:22.873625Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:25:22.896943Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-13T23:25:22.896947Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:25:22.920618Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-13T23:25:22.920623Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:25:22.943957Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-13T23:25:22.943961Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:25:22.967202Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-13T23:25:22.967206Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:25:22.990432Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-13T23:25:22.990437Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:25:23.014293Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-13T23:25:23.014297Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:25:23.037478Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-13T23:25:23.037482Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:25:23.060574Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-13T23:25:23.060581Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:25:23.574232Z INFO - Updating database statistics: 0.428ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:25:25.385284Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:25:25.402644Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:25:25.417111Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:25:25.431359Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:25:25.573970Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:25:25.591944Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:25:25.608321Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:25:25.623517Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:25:27.845733Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:25:28.578624Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:25:30.357854Z WARN - mcp: Removing pager 24d08270dce3082a4da0b022e36afb7a (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 1:22 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Retrying (1/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:30:17.025618Z INFO - Updating database statistics: 0.233ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:31:13.736874Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:31:13.750283Z WARN - mcp: method not found: unknown/method 2025-11-13T23:31:14.040880Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:31:14.949169Z INFO - Ktistec is going to take a rest! 2025-11-13T23:31:23.517558Z INFO - Ktistec is going to take a rest! 2025-11-13T23:31:54.795966Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:31:54.821445Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:31:54.845623Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:31:54.869875Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:31:54.897364Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:31:56.324019Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/jfgmcvia published=false 2025-11-13T23:31:56.325635Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/lnvbqjid published=true 2025-11-13T23:31:56.328295Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/scpdijtz published=true 2025-11-13T23:31:56.330429Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/qfikdoym published=false 2025-11-13T23:31:56.331230Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/lyjqhimd 2025-11-13T23:31:56.333324Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/mpvkcfeu 2025-11-13T23:31:56.335305Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/jxirhpfz 2025-11-13T23:31:56.337343Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/vagmfrzn 2025-11-13T23:31:56.524276Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/ghofdmck 2025-11-13T23:31:56.556761Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/ymfqhncb 2025-11-13T23:31:57.408949Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/eodshacl 2025-11-13T23:31:57.438256Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:57.446484Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:57.446492Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:57.446496Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:57.447518Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:57.447523Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:57.449164Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:57.454218Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:57.454227Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:57.454236Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:57.454837Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:57.454840Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:57.455379Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:57.458657Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:31:57.458665Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.449127Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.454415Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.454424Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.455979Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.461333Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.461342Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.463381Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.468793Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.468801Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.468805Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.469451Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.469455Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.496611Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.501747Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.501756Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.530840Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.536546Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.536555Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.564863Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.570158Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.570167Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.572450Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.577950Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.577959Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.577971Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.578634Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.578638Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.602792Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.608131Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.608143Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.610421Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.615671Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.615679Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.615683Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.616337Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.616342Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.642326Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.647990Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.647999Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.650248Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.655297Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.655306Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.655318Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.655916Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.655926Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.687984Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.693153Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.693161Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.695385Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.700847Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.700855Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.700860Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.701483Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.701488Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.730379Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.735682Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.735690Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.737849Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.743294Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.743305Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.743315Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.743899Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.743903Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.768555Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.774190Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.774198Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.776456Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.781716Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.781724Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:31:58.781728Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:31:58.782349Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.782353Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:31:58.808895Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.813820Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:31:58.813828Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.817211Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.822425Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.822438Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:31:58.822448Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:31:58.824153Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:31:58.824158Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:31:58.828109Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.833261Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.833269Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.859652Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.865013Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.865021Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.890686Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.896067Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.896076Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:58.923093Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:58.928790Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:58.928799Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:31:59.638831Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:31:59.646683Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:31:59.646692Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:31:59.646699Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:31:59.697000Z INFO - task.collect_garbage: Batch 1 completed in 0.05 seconds 2025-11-13T23:31:59.697021Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:31:59.745406Z INFO - task.collect_garbage: Batch 2 completed in 0.05 seconds 2025-11-13T23:31:59.745419Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:31:59.794555Z INFO - task.collect_garbage: Batch 3 completed in 0.05 seconds 2025-11-13T23:31:59.794569Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:31:59.842646Z INFO - task.collect_garbage: Batch 4 completed in 0.05 seconds 2025-11-13T23:31:59.842670Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:31:59.890941Z INFO - task.collect_garbage: Batch 5 completed in 0.05 seconds 2025-11-13T23:31:59.890955Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:31:59.938374Z INFO - task.collect_garbage: Batch 6 completed in 0.05 seconds 2025-11-13T23:31:59.938387Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:31:59.985241Z INFO - task.collect_garbage: Batch 7 completed in 0.05 seconds 2025-11-13T23:31:59.985263Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:32:00.032816Z INFO - task.collect_garbage: Batch 8 completed in 0.05 seconds 2025-11-13T23:32:00.032831Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:32:00.081278Z INFO - task.collect_garbage: Batch 9 completed in 0.05 seconds 2025-11-13T23:32:00.081299Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:32:00.128650Z INFO - task.collect_garbage: Batch 10 completed in 0.05 seconds 2025-11-13T23:32:00.128666Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:32:01.065241Z INFO - Updating database statistics: 0.804ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:32:04.526255Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:32:04.561016Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:32:04.594816Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:32:04.627713Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:32:04.925606Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:32:04.962894Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:32:04.999729Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:32:05.038472Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:32:09.158094Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:32:10.508232Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:32:13.559305Z WARN - mcp: Removing pager 7c415b72bc33476a7ee3379a79d20d59 (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 1:56 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Retrying (2/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0006s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:36:42.513633Z INFO - Updating database statistics: 0.245ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:38:05.160883Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:38:05.185621Z WARN - mcp: method not found: unknown/method 2025-11-13T23:38:05.798024Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:38:07.444962Z INFO - Ktistec is going to take a rest! 2025-11-13T23:38:16.325849Z INFO - Ktistec is going to take a rest! 2025-11-13T23:38:44.690072Z NOTICE - database: Slow query [ 864.064ms] -- SELECT "type","id","blocked_at","created_at","updated_at","deleted_at","type","iri","username","pem_public_key","pem_private_key","shared_inbox","inbox","outbox","following","followers","name","summary","icon","image","urls","attachments","down_at" FROM "actors" WHERE "iri" = ? AND "deleted_at" IS NULL -- args: ["https://remote/actors/usykmiga"] 2025-11-13T23:38:44.690285Z NOTICE - database: [{0, "SEARCH actors USING INDEX idx_actors_iri (iri=?)"}] 2025-11-13T23:38:54.598388Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:38:54.616389Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:38:54.632980Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:38:54.650802Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:38:54.666828Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:38:55.521373Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/wlrbzxqf published=false 2025-11-13T23:38:55.522615Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/rgyusoaz published=true 2025-11-13T23:38:55.524290Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/itxcnqwm published=true 2025-11-13T23:38:55.525574Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/lvgdrzkw published=false 2025-11-13T23:38:55.526087Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ndlhtjuv 2025-11-13T23:38:55.527445Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/wplyxskg 2025-11-13T23:38:55.528656Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/bfosywze 2025-11-13T23:38:55.529851Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/wahvcokz 2025-11-13T23:38:56.144723Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/fbtyvend 2025-11-13T23:38:56.165792Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/lgpfekmn 2025-11-13T23:38:56.184554Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/wyxnfjdo 2025-11-13T23:38:56.202995Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.207625Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.207627Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.207629Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.208190Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.208192Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.209085Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.211661Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.211663Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.211665Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.211998Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.211999Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.212278Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.213912Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.213914Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.838978Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.841943Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.841946Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.842707Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.845379Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.845381Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.846414Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.848970Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.848972Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.848975Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.849326Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.849327Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.868110Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.870901Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.870903Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.885659Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.888425Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.888427Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.904715Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.907392Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.907394Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.908591Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.911219Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.911222Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.911224Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.911588Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.911590Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.926912Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.929613Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.929615Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.930848Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.933515Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.933517Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.933520Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.933857Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.933858Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.954219Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.956963Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.956965Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.958107Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.960678Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.960680Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.960682Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.961002Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.961003Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.977722Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.980394Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.980395Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:56.981583Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:56.984232Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:56.984234Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:56.984235Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:56.984578Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:56.984579Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:56.999824Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.002726Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.002728Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.003917Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.006684Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.006686Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:57.006687Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:57.007008Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:57.007010Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:57.023387Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.026080Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.026082Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.027280Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.029790Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.029792Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:38:57.029794Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:38:57.030096Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:57.030099Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:38:57.045379Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.047882Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.047884Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.049755Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.052239Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.052241Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:38:57.052243Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:38:57.053158Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:38:57.053160Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:38:57.055374Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.057850Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.057853Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.073033Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.075585Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.075587Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.092864Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.095495Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.095498Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.110917Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.113603Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.113605Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:38:57.485483Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:38:57.490056Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:38:57.490059Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:38:57.490063Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:38:57.515128Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-13T23:38:57.515132Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:38:57.539147Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-13T23:38:57.539153Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:38:57.562919Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-13T23:38:57.562923Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:38:57.586402Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-13T23:38:57.586406Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:38:57.609903Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-13T23:38:57.609909Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:38:57.633448Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-13T23:38:57.633452Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:38:57.657362Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-13T23:38:57.657366Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:38:57.680827Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-13T23:38:57.680834Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:38:57.704313Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-13T23:38:57.704317Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:38:57.727753Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-13T23:38:57.727755Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:38:58.223354Z INFO - Updating database statistics: 0.455ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:39:00.013330Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:39:00.028724Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:39:00.047768Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:39:00.063887Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:39:00.205736Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:39:00.221331Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:39:00.238190Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:39:00.254239Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:39:02.490936Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:39:03.228999Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:39:06.174276Z WARN - mcp: Removing pager ddc0bcd5d06b3961a9f065a7d858a269 (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 2:23 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Retrying (3/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0011s add-auto-follow-back-to-accounts: applied in 0.0009s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:43:23.341040Z INFO - Updating database statistics: 0.383ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:44:52.066557Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:44:52.082170Z WARN - mcp: method not found: unknown/method 2025-11-13T23:44:52.388422Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:44:53.221586Z INFO - Ktistec is going to take a rest! 2025-11-13T23:44:57.858079Z INFO - Ktistec is going to take a rest! 2025-11-13T23:45:09.020540Z NOTICE - database: Slow query [ 720.540ms] -- SELECT "objects"."type","objects"."id","objects"."blocked_at","objects"."created_at","objects"."updated_at","objects"."deleted_at","objects"."type","objects"."iri","objects"."visible","objects"."sensitive","objects"."published","objects"."updated","objects"."attributed_to_iri","objects"."in_reply_to_iri","objects"."replies_iri","objects"."thread","objects"."to","objects"."cc","objects"."audience","objects"."name","objects"."summary","objects"."content","objects"."media_type","objects"."language","objects"."source","objects"."attachments","objects"."urls" FROM objects WHERE "objects"."id" = ? AND "objects"."attributed_to_iri" != ? AND objects."deleted_at" IS NULL AND objects."type" IN ('ActivityPub::Object','ActivityPub::Object::Article','ActivityPub::Object::Note','ActivityPub::Object::Tombstone','SpectatorTestContext::Group__temp_17660::Group__temp_17718::Group__temp_18232::ExternalObject','FooBarObject','ActivityPub::Object::Audio','ActivityPub::Object::Event','ActivityPub::Object::Image','ActivityPub::Object::Page','ActivityPub::Object::Place','ActivityPub::Object::Question','ActivityPub::Object::Video') -- args: [3, "https://remote/actors/awymtgbk"] 2025-11-13T23:45:09.020840Z NOTICE - database: [{0, "SEARCH objects USING INTEGER PRIMARY KEY (rowid=?)"}] 2025-11-13T23:45:25.025344Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:45:25.039372Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:45:25.053284Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:45:25.067088Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:45:25.080635Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:45:25.813151Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/snbwdmzj published=false 2025-11-13T23:45:25.814268Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/ecuvfhbs published=true 2025-11-13T23:45:25.815772Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/pbmzsfuo published=true 2025-11-13T23:45:25.816933Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/scptkxnf published=false 2025-11-13T23:45:25.817420Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/rhnqomkz 2025-11-13T23:45:25.818521Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/hrjcknyq 2025-11-13T23:45:25.819618Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/anslkjtq 2025-11-13T23:45:25.820739Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/bqjkmwlt 2025-11-13T23:45:26.393214Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/cgeyknzq 2025-11-13T23:45:26.410822Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/nbfehxiy 2025-11-13T23:45:26.426183Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/dxfzjtav 2025-11-13T23:45:26.446957Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:26.451126Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:26.451128Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:26.451130Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:26.451677Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:26.451678Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:26.452488Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:26.454834Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:26.454836Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:26.454838Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:26.455148Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:26.455150Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:26.455399Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:26.456881Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:26.456883Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.029275Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.031683Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.031685Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.032372Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.034735Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.034737Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.035663Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.038045Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.038047Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.038050Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.038368Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.038370Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.052602Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.054948Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.054950Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.070878Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.073276Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.073278Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.092197Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.094580Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.094582Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.095692Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.098067Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.098070Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.098071Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.098412Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.098413Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.115275Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.117692Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.117694Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.118826Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.121240Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.121242Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.121246Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.121573Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.121575Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.135625Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.138049Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.138050Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.139129Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.141466Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.141468Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.141470Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.141776Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.141778Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.156181Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.158475Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.158477Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.159539Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.161893Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.161895Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.161896Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.162223Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.162225Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.176431Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.178818Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.178820Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.179913Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.182280Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.182282Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.182284Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.182597Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.182598Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.197706Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.200080Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.200081Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.201146Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.203418Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.203420Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:45:27.203422Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:45:27.203732Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.203733Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:45:27.217662Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.219914Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.219916Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.221661Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.223908Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.223910Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:45:27.223912Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:45:27.224812Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:45:27.224813Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:45:27.226939Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.229183Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.229185Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.248499Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.250727Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.250728Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.264692Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.267031Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.267033Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.284563Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.287018Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.287020Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:45:27.640218Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:45:27.644432Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:45:27.644435Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:45:27.644439Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:45:27.670438Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-13T23:45:27.670443Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:45:27.694551Z INFO - task.collect_garbage: Batch 2 completed in 0.02 seconds 2025-11-13T23:45:27.694556Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:45:27.718673Z INFO - task.collect_garbage: Batch 3 completed in 0.02 seconds 2025-11-13T23:45:27.718677Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:45:27.742764Z INFO - task.collect_garbage: Batch 4 completed in 0.02 seconds 2025-11-13T23:45:27.742768Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:45:27.766847Z INFO - task.collect_garbage: Batch 5 completed in 0.02 seconds 2025-11-13T23:45:27.766853Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:45:27.791404Z INFO - task.collect_garbage: Batch 6 completed in 0.02 seconds 2025-11-13T23:45:27.791408Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:45:27.815463Z INFO - task.collect_garbage: Batch 7 completed in 0.02 seconds 2025-11-13T23:45:27.815468Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:45:27.839500Z INFO - task.collect_garbage: Batch 8 completed in 0.02 seconds 2025-11-13T23:45:27.839506Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:45:27.863624Z INFO - task.collect_garbage: Batch 9 completed in 0.02 seconds 2025-11-13T23:45:27.863629Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:45:27.887552Z INFO - task.collect_garbage: Batch 10 completed in 0.02 seconds 2025-11-13T23:45:27.887555Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:45:28.387993Z INFO - Updating database statistics: 0.435ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:45:30.185819Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:45:30.200679Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:45:30.216053Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:45:30.231485Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:45:30.367775Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:45:30.382926Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:45:30.399284Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:45:30.414770Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:45:32.655960Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:45:33.411623Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:45:35.183746Z WARN - mcp: Removing pager 2e820899002c1ee5f0841069d37ea213 (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 2:11 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Retrying (4/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0006s add-auto-follow-back-to-accounts: applied in 0.0005s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:49:37.640422Z INFO - Updating database statistics: 0.215ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:50:26.091359Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:50:26.105012Z WARN - mcp: method not found: unknown/method 2025-11-13T23:50:26.393348Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:50:27.231325Z INFO - Ktistec is going to take a rest! 2025-11-13T23:50:31.914936Z INFO - Ktistec is going to take a rest! 2025-11-13T23:50:43.022939Z NOTICE - database: Slow query [ 52.796ms] -- SELECT "objects"."type","objects"."id","objects"."blocked_at","objects"."created_at","objects"."updated_at","objects"."deleted_at","objects"."type","objects"."iri","objects"."visible","objects"."sensitive","objects"."published","objects"."updated","objects"."attributed_to_iri","objects"."in_reply_to_iri","objects"."replies_iri","objects"."thread","objects"."to","objects"."cc","objects"."audience","objects"."name","objects"."summary","objects"."content","objects"."media_type","objects"."language","objects"."source","objects"."attachments","objects"."urls" FROM objects WHERE "objects"."id" = ? AND "objects"."thread" IS NOT NULL AND objects."deleted_at" IS NULL AND objects."type" IN ('ActivityPub::Object','ActivityPub::Object::Article','ActivityPub::Object::Note','ActivityPub::Object::Tombstone','SpectatorTestContext::Group__temp_17660::Group__temp_17718::Group__temp_18232::ExternalObject','FooBarObject','ActivityPub::Object::Audio','ActivityPub::Object::Event','ActivityPub::Object::Image','ActivityPub::Object::Page','ActivityPub::Object::Place','ActivityPub::Object::Question','ActivityPub::Object::Video') -- args: [3] 2025-11-13T23:50:43.023139Z NOTICE - database: [{0, "SEARCH objects USING INTEGER PRIMARY KEY (rowid=?)"}] 2025-11-13T23:50:55.895718Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:50:55.911648Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:50:55.928423Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:50:55.944647Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:50:55.961160Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:50:56.805648Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/mijlzcdn published=false 2025-11-13T23:50:56.806862Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/sluhzdpf published=true 2025-11-13T23:50:56.808496Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/guroxbfh published=true 2025-11-13T23:50:56.809845Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/mgpfbtzx published=false 2025-11-13T23:50:56.810371Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/psflwzqm 2025-11-13T23:50:56.811594Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/smfctxlk 2025-11-13T23:50:56.812817Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/vlmftoyw 2025-11-13T23:50:56.813991Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/ukifqanz 2025-11-13T23:50:57.422334Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/qokyzvdi 2025-11-13T23:50:57.438813Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/snzkmhoe 2025-11-13T23:50:57.455741Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/padlkhqg 2025-11-13T23:50:57.474729Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:57.479363Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:57.479366Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:57.479368Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:57.479937Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:57.479939Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:57.480852Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:57.483434Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:57.483437Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:57.483438Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:57.483767Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:57.483768Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:57.484038Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:57.485813Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:57.485815Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.082755Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.085637Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.085640Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.086388Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.088938Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.088941Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.089938Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.092452Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.092454Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.092458Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.092788Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.092790Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.109679Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.112199Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.112201Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.130465Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.133166Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.133168Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.149998Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.152645Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.152647Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.153841Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.156419Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.156422Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.156424Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.156770Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.156771Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.173404Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.176075Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.176077Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.177297Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.179895Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.179897Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.179901Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.180263Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.180264Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.195873Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.198559Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.198561Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.199709Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.202186Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.202188Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.202190Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.202510Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.202511Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.218473Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.220973Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.220975Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.222119Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.224744Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.224748Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.224749Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.225072Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.225073Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.241938Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.244947Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.244949Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.246183Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.248833Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.248835Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.248837Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.249193Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.249195Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.264851Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.268049Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.268051Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.269339Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.271945Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.271947Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:50:58.271949Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:50:58.272306Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.272308Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:50:58.291226Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.294199Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.294202Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.296228Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.298778Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.298781Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:50:58.298783Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:50:58.299734Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:50:58.299736Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:50:58.302047Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.304555Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.304558Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.321350Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.324106Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.324108Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.340745Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.343694Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.343696Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.361175Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.364245Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.364247Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:50:58.750065Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:50:58.754388Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:50:58.754391Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:50:58.754395Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:50:58.781923Z INFO - task.collect_garbage: Batch 1 completed in 0.03 seconds 2025-11-13T23:50:58.781931Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:50:58.809160Z INFO - task.collect_garbage: Batch 2 completed in 0.03 seconds 2025-11-13T23:50:58.809172Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:50:58.836099Z INFO - task.collect_garbage: Batch 3 completed in 0.03 seconds 2025-11-13T23:50:58.836106Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:50:58.862617Z INFO - task.collect_garbage: Batch 4 completed in 0.03 seconds 2025-11-13T23:50:58.862624Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:50:58.889008Z INFO - task.collect_garbage: Batch 5 completed in 0.03 seconds 2025-11-13T23:50:58.889020Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:50:58.916414Z INFO - task.collect_garbage: Batch 6 completed in 0.03 seconds 2025-11-13T23:50:58.916422Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:50:58.943862Z INFO - task.collect_garbage: Batch 7 completed in 0.03 seconds 2025-11-13T23:50:58.943870Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:50:58.970840Z INFO - task.collect_garbage: Batch 8 completed in 0.03 seconds 2025-11-13T23:50:58.970853Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:50:58.997856Z INFO - task.collect_garbage: Batch 9 completed in 0.03 seconds 2025-11-13T23:50:58.997865Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:50:59.025661Z INFO - task.collect_garbage: Batch 10 completed in 0.03 seconds 2025-11-13T23:50:59.025668Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:50:59.558053Z INFO - Updating database statistics: 0.459ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:51:01.422518Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:51:01.441080Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:51:01.456304Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:51:01.473765Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:51:01.627274Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:51:01.645532Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:51:01.665458Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:51:01.683250Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:51:03.978293Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:51:04.721899Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:51:06.510334Z WARN - mcp: Removing pager 5e297771862702360b2c132ceeddca06 (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 1:28 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Retrying (5/5)... SQLite3 version 3.51.0 add-auto-approve-followers-to-accounts: applied in 0.0007s add-auto-follow-back-to-accounts: applied in 0.0006s TaskWorker .stop signals the worker to stop given a scheduled task 2025-11-13T23:55:54.445319Z INFO - Updating database statistics: 0.260ms waits for scheduled tasks to complete #work calls perform on all scheduled tasks ensures task is not left running does not resurrect a task that has been destroyed stores the backtrace when task throws an uncaught exception does not store the backtrace when task throws a server shutdown exception sets complete to true leaves complete as false if task wasn't scheduled leaves complete as false if task throws an uncaught exception leaves complete as false if task is rescheduled sets last_attempt_at returns true if work was done returns false if work was not done ContentRules .new creates an instance #run given an empty outbox adds the activity to the outbox given an empty inbox does not add the activity to the inbox owner in recipients adds the activity to the inbox public URL in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox followers collection in recipients does not add the activity to the inbox and owner is follows activity's actor adds the activity to the inbox given no notifications does not add the create to the notifications does not add the announce to the notifications does not add the like to the notifications adds the follow to the notifications object mentions the owner adds the object to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object mentions another actor does not add the object to the notifications another object mentions the owner does not add the object to the notifications object is in reply to an object attributed to the owner adds the reply to the notifications adds the object to the notifications and is attributed to the owner does not add the object to the notifications does not add the object to the notifications object is in reply to an object attributed to another actor does not add the reply to the notifications in a thread being followed by the owner adds the reply to the notifications adds the reply to the notifications but object is not the root of the thread does not add the reply to the notifications does not add the reply to the notifications in a thread being followed by another actor does not add the reply to the notifications does not add the reply to the notifications another object is in reply to an object attributed to the owner does not add the reply to the notifications object both is in reply to an object attributed to the owner and mentions the owner adds the object to the notifications once gives preference to the reply notification object is tagged with hashtags where object is attributed to the owner does not add the hashtag to the notifications does not add the hashtag to the notifications where 'foo' is followed by the owner adds the hashtag to the notifications adds the hashtag to the notifications and 'bar' is followed by the owner adds both hashtags to the notifications adds both hashtags to the notifications where 'foo' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications and 'bar' is followed by another actor does not add the hashtag to the notifications does not add the hashtag to the notifications object is tagged with mentions where object is attributed to the owner does not add the object to the notifications does not add the object to the notifications where 'foo@remote.com' is followed by the owner adds the object to the notifications adds the object to the notifications and 'bar@remote.com' is followed by the owner adds a single object to the notifications adds a single object to the notifications where 'foo@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications and 'bar@remote.com' is followed by another actor does not add the object to the notifications does not add the object to the notifications object is tagged with a hashtag and a mention and is a reply does add any notifications and all three are followed by owner adds three notifications object is attributed to the owner adds the announce to the notifications adds the like to the notifications another object is attributed to the owner does not add the announce to the notifications does not add the like to the notifications follow does not follow the owner does not add the follow to the notifications given notifications with a followed hashtag already added for the owner removes the previous notification from the notifications does not add a duplicate hashtag to the notifications removes the previous notification from the notifications does not add a duplicate hashtag to the notifications for other owner adds the hashtag to the notifications adds the hashtag to the notifications given notifications with a followed mention already added for the owner removes the previous notification from the notifications does not add a duplicate mention to the notifications removes the previous notification from the notifications does not add a duplicate mention to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with a followed thread reply already added for the owner removes the previous create from the notifications does not add another object to the notifications removes the previous announce from the notifications does not add another object to the notifications for other owner adds the object to the notifications adds the object to the notifications given notifications with mention added via create does not add the mention to the notifications removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications and an unrelated undo does not remove the mention from the notifications given notifications with mention added via update removes the mention from the notifications and an unrelated delete does not remove the mention from the notifications given notifications with reply added via create does not add the reply to the notifications removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications and an unrelated undo does not remove the reply from the notifications given notifications with reply added via update removes the reply from the notifications and an unrelated delete does not remove the reply from the notifications given notifications with an announce already added does not add the announce to the notifications removes the announce from the notifications does not remove the announce from the notifications given notifications with another announce for the same object adds the announce to the notifications removes the previous announce from the notifications given notifications with a like already added does not add the like to the notifications removes the like from the notifications does not remove the like from the notifications given notifications with another like for the same object adds the like to the notifications removes the previous like from the notifications given notifications with follow already added does not add the follow to the notifications removes the follow from the notifications does not remove the follow from the notifications given notifications with an announce that has been undone removes the announce from the notifications given an empty timeline adds the object to the timeline adds the object to the timeline object is a reply does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline another object is a reply adds the object to the timeline adds the object to the timeline object mentions the owner adds the object to the timeline adds the object to the timeline object mentions the owner and another actor adds the object to the timeline adds the object to the timeline object mentions another actor does not add the object to the timeline adds the object to the timeline but is attributed to the owner adds the object to the timeline given a timeline with an object already added and an associated create does not add the object to the timeline removes the object from the timeline and an unrelated delete does not remove the object from the timeline and an unrelated undo does not remove the object from the timeline and an associated announce does not add the object to the timeline removes the object from the timeline and a related undo removes the object from the timeline and another announce does not remove the object from the timeline that has been undone removes the object from the timeline given a timeline with another object already added does not remove the object from the timeline does not remove the object from the timeline given a timeline with an object that has been deleted destroys the timeline entry given an empty timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor adds the object to the timeline adds the object to the timeline adds the object to the timeline adds the object to the timeline given a content filter adds the object to the timeline adds the object to the timeline given a content filter of the actor does not add the object to the timeline does not add the object to the timeline Ktistec::HTML .enhance returns enhancements returns attachments for embedded images strips attributes from the figure strips attributes from the figcaption removes the anchor but preserves the img and figcaption preserves lone br removes trailing br replaces double br with p handles inline elements correctly handles inline elements correctly handles inline elements correctly handles inline elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles block elements correctly handles Trix figure elements correctly preserves adjacent elements preserves text trims empty p hashtags replaces hashtags with markup preserves adjacent text skips hashtags inside links skips hashtags inside pre blocks skips hashtags inside code blocks returns hashtags given full-width hash sign replaces hashtags with markup handles mixed hash and full-width hash signs returns hashtags mentions replaces mentions with links preserves adjacent text skips mentions inside links skips mentions inside pre blocks skips mentions inside code blocks returns mentions given a mention of an uncached actor replaces mentions with links returns mentions given a mention of a nonexistent actor replaces unmatched mentions with spans doesn't return mentions handles both hashtags and mentions bare URLs converts bare URLs to links converts bare HTTPS URLs to links preserves adjacent text handles URLs with paths, query strings, and fragments strips trailing punctuation handles URLs in parentheses handles multiple URLs in one text node handles URLs mixed with hashtags and mentions skips URLs in links skips URLs in pre blocks skips URLs in code blocks links to local objects/actors converts relative internal links to relative external links converts absolute internal links to absolute external links converts relative internal links to relative external links converts absolute internal links to absolute external links links to remote objects/actors does not convert relative internal links does not convert absolute internal links does not convert relative internal links does not convert absolute internal links JSON::RPC::Request .from_json parses request with string id parses request with integer id parses request with params #to_json serializes request without params serializes request with params notifications .from_json parses notification (without id) parses notification with params #to_json serializes notification without params serializes notification with params JSON::RPC::Response success #to_json serializes success response .from_json parses success response error #to_json serializes error response without data serializes error response with data .from_json parses error response validation raises error when both result and error are provided raises error when neither result nor error are provided identifies success responses correctly identifies error responses correctly Ktistec::Network .resolve returns the IRI resolves and returns the IRI resolves and returns the IRI Ktistec::Node #clone clones the node Ktistec::PrefixOperator #nud returns a prefix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::InfixOperator #led returns an infix operator consumes the expression to the right raises an error if there is no expression to the right Ktistec::RuleDefinition::Pattern #parse allows keywords as arguments allows expressions as arguments allows keywords in option keys allows expressions in option values raises on error if option key is invalid raises an error if definition includes multiple constants raises an error if definition does not include a constant given a pattern returns a pattern parses the constant parses the arguments parses the options positions the parser on the next token Ktistec::RuleDefinition #std returns a rule parses the name parses the trace keyword parses the patterns raises an error if name is not a literal string raises an error if end is missing #clone deep copies patterns Ktistec::Parser #current returns a node is a constant is an identifier is an operator is a rule definition is a keyword raises an error when string is unterminated raises an error when operator is invalid #advance raises an error if specified id does not match the current node's id #expression is end of input given a prefix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right given an infix operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no expression to the right raises an error if there is no expression to the right raises an error if there is no expression to the left given a function operator parses the expression positions the parser on the next token positions the parser on the next token positions the parser on the next token raises an error if there is no closing parenthesis raises an error if there is no closing parenthesis raises an error if there is no expression to the left raises an error if the expression to the left is not an identifier #statement is end of input given a rule definition parses the statement positions the parser on the next token raises an error if end is missing #statements returns no statements returns two rules Ktistec::Database .recreate_timeline_and_notifications given notifications leaves entries that belong removes entries that don't belong adds entries that are missing given a timeline leaves entries that belong removes entries that don't belong adds entries that are missing Ktistec::Translator::DeepLTranslator instantiates the class requests supported source languages requests supported target languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source_lang` parameter does not send the `source_lang` parameter when the source language is not supported sends the language without the variant in the `target_lang` parameter sends the language and variant in the `target_lang` parameter when it has a supported variant Ktistec::Translator::LibreTranslateTranslator instantiates the class requests supported languages #translate translates only the name translates only the summary translates only the content sends the language without the variant in the `source` parameter sends 'auto' in the `source` parameter when the source language is not supported sends the language without the variant in the `target` parameter Ktistec::Lexer #advance returns a token is end of input is a literal string is a literal string is an error if the string is unterminated is a literal int is a literal float is a literal int is a literal float is a literal int is a literal float is a constant is an identifier is an operator is an operator is an operator ignores whitespace ignores comments handles successive tokens handles successive tokens ignores whitespace ignores comments Ktistec::RSS .generate_rss_feed renders basic RSS structure given HTML characters in feed title escapes HTML characters given HTML characters in feed URL escapes HTML characters given HTML characters in description escapes HTML characters in description includes other channel metadata with language specified includes language in channel metadata with an object includes item with HTML in object title strips HTML from title and truncates with special characters in object title handles title with special characters when name is nil uses content as title with HTML in object content handles content with HTML with URLs in object escapes URL with special characters in author username escapes author username with two objects includes two items Ktistec::Compiler #compile returns a domain compiles rule definitions given a rule the compiled domain defines one rule with rule has the specified name defines conditions with conditions is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound is a literal is a variable handles not handles not with accessor invokes accessor raises an error if receiver doesn't respond to accessor raises an error if receiver is unbound defines actions with actions invokes assert method invokes retract method given a rule with 'within' supports the predicate 'within' given a rule with 'strip' supports the function 'strip' given a rule with 'filter' supports the function 'filter' given a rule definition with trace specified enables tracing given a rule definition using any defines conditions is Any given a rule definition using none defines conditions is None given a rule definition using a fact defines conditions is a nullary pattern given a fact and a rule definition asserting a fact defines actions asserts a fact and a rule definition retracting a fact defines actions retracts a fact given a rule definition using a property fact defines conditions is a unary pattern given a fact and a rule definition asserting a property fact defines actions asserts a fact and a rule definition retracting a property fact defines actions retracts a fact given a rule definition using a relationship fact defines conditions is a binary pattern given a fact and a rule definition asserting a relationship fact defines actions asserts a fact and a rule definition retracting a relationship fact defines actions retracts a fact raises an error if constant is undefined raises an error if there are too many arguments raises an error if accessor is undefined ThreadAnalysisService .key_participants identifies OP as first participant sorts remaining participants by object count includes correct object counts includes correct depth ranges includes correct time spans includes all objects for each participant returns limited participants (including OP) the default limit is 18 (including OP) .notable_branches sorts branches by size includes only branches with >= 5 objects includes correct depth ranges includes correct time spans includes correct author counts includes all objects returns at most 10 branches respects custom threshold respects custom limit edge cases handles single object .timeline_histogram sum of buckets matches total objects last bucket cumulative count matches total objects returns histogram with correct bucket size computes unique author counts per bucket objects are placed in only one bucket outlier elimination detects outliers when 6-hour minimum exceeds 3x median does not exclude gaps below 6-hour minimum detects outliers when 3x median exceeds 6-hour minimum does not exclude gaps below 3x median granularity selection uses 5-minute buckets for short threads uses hourly buckets for medium threads uses daily buckets for week-long threads uses weekly buckets for month-long threads edge cases handles single object omits empty buckets in sparse threads OutboxActivityProcessor .process with a Follow activity creates a follow relationship sets the relationship as unconfirmed schedules deliver task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules deliver task with a Reject activity confirms the follow relationship schedules deliver task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules deliver task given an Announce marks the announce activity as undone schedules deliver task with a Delete activity given an Object marks the object as deleted schedules deliver task given an Actor marks the actor as deleted schedules deliver task with Create activity schedules deliver task with Announce activity schedules deliver task InboxActivityProcessor .process with a Follow activity creates a follow relationship given another actor does not create a follow relationship sets the relationship as unconfirmed passes deliver_to to receive task schedules handle follow request task schedules receive task given an existing relationship does not create a duplicate relationship with an Accept activity confirms the follow relationship schedules receive task with a Reject activity confirms the follow relationship schedules receive task with an Undo activity given a Follow destroys the follow relationship marks the follow activity as undone schedules receive task given an Announce marks the announce activity as undone schedules receive task with a Delete activity given an Object marks the object as deleted schedules receive task given an Actor marks the actor as deleted schedules receive task with Create activity schedules receive task with Announce activity schedules receive task Ktistec::DescriptionEnhancer .enhanced_description when description is nil returns empty string when description is blank returns empty string with valid description enhances and sanitizes content caching behavior caches the result recomputes when assigned SessionsController GET /sessions responds with HTML responds with JSON POST /sessions redirects if params are missing redirects if params are missing rerenders if params are incorrect rerenders if params are incorrect sets cookie and redirects  returns token given a redirect path in the session redirects to the path returns the path cookie attributes sets a secure, host-only cookie DELETE /sessions fails to authenticate fails to authenticate destroys session and redirects destroys session and redirects UploadsController .get_upload with path string returns nil for valid path string when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path string returns nil for path traversal attempt returns nil for malformed id with path components returns nil for valid path components when authenticated returns Upload instance returns nil for file owned by another user returns nil for invalid path components returns nil for path traversal attempt returns nil for malformed id POST /uploads returns 401 if not authorized when authorized is successful returns the resource URL in the location header returns the resource path in the response stores the file makes the file readable if file is not present returns 400 DELETE /uploads/:p1/:p2/:p3/:id returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist DELETE /uploads returns 401 if not authorized when authorized is successful deletes the file returns 404 if the path contains invalid characters returns 404 if the upload does not belong to the user returns 404 if the upload does not exist MentionsController GET /mentions returns 401 returns 401 when authenticated succeeds succeeds renders the collection renders the collection renders the collection renders the collection returns 404 if no such mention exists turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 POST /mentions/follow returns 401 when authenticated succeeds follows the mention within a turbo-frame succeeds renders an unfollow button given an existing follow succeeds does not change the count of mention relationships within a turbo-frame succeeds renders an unfollow button returns 404 if no mentioned objects exist POST /mentions/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds renders a follow button given an existing follow succeeds unfollows the mention within a turbo-frame succeeds renders a follow button returns 404 if no mentioned objects exist SuggestionsController GET /tags returns 401 if not authorized when authorized hashtag returns the best match mention returns the best match returns 400 if no prefix is specified OAuth2Controller POST /oauth/register registers a new client with invalid metadata rejects a missing client_name rejects a blank client_name rejects a missing redirect_uris rejects an invalid redirect_uri rejects malformed JSON when the provisional client buffer is full discards the oldest client GET /oauth/authorize redirects to the login page when authenticated renders the consent screen without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client renders the consent screen POST /oauth/authorize fails with a 401 when authenticated redirects to the client with a code without a code_challenge returns a bad request with an invalid code_challenge_method returns a bad request with an invalid client_id returns a bad request with an invalid redirect_uri returns a bad request without a response_type returns a bad request with a provisional client promotes it to a permanent client when denied redirects to the client with an error deletes and does not promote the provisional client POST /oauth/token returns an access token updates the client's last_accessed_at timestamp deletes the authorization code after use without a client_secret returns an access token with basic authentication returns an access token and invalid credentials returns an error returns an error with an invalid grant_type returns an error without a code returns an error with an invalid code given an expired code returns an error returns an error with a mismatched client_id returns an error with an invalid client_secret returns an error with a mismatched redirect_uri returns an error with an invalid code_verifier FiltersController .get_filter_term when unauthenticated returns nil when authenticated returns the owned filter term returns nil if user does not own the term returns nil if the term does not exist GET /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection POST /filters returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds adds a new content filter term adds a new content filter term returns 422 if term is blank returns 422 if term is blank renders an error message if term is blank returns an error message if term is blank given existing terms returns 422 if term already exists returns 422 if term already exists renders an error message if term already exists renders an error message if term already exists DELETE /filters/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if term does not exist returns 404 if term does not exist given existing terms returns 404 if term does not belong to the actor returns 404 if term does not belong to the actor redirects if successful redirects if successful destroys the term destroys the term SettingsController GET /settings returns 401 if not authorized when authorized and accepting HTML succeeds renders a form for name, summary, image, and icon renders a form for description, footer, and site does not render an option for the translator service does not render an input for the service URL given an API key for the DeepL service renders an option for the DeepL service does not render an option for the LibreTranslate service renders an input for the service URL given an API key for the LibreTranslate service renders an option for the LibreTranslate service does not render an option for the DeepL service renders an input for the service URL and accepting JSON succeeds renders an object POST /settings/actor returns 401 if not authorized when authorized and posting urlencoded data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if empty updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments and posting form data updates the image updates the icon stores the image file makes the image file readable stores the icon file makes the icon file readable given existing image and icon updates the image updates the icon and posting JSON data succeeds updates the name given an actor with a name updates the name if blank updates the summary updates the language given an account with a language does not update the language if blank updates the timezone given an account with a timezone does not update the timezone if blank updates the password does not update the password if blank does not update the password if null updates the image updates the icon given an actor with an image and an icon removes the image removes the icon updates the attachments POST /settings/service returns 401 if not authorized when authorized and posting urlencoded data succeeds does not change the host changes the site does not change the site changes the description given a description clears the description if blank changes the footer given a footer clears the footer if blank and posting JSON data succeeds does not change the host changes the site does not change the site changes the footer given a footer changes the footer if blank POST /settings/terminate returns 401 if not authorized when authorized schedules a terminate task destroys the account ends the session redirects TasksController GET /tasks returns 401 if not authorized when authorized succeeds does not render any tasks does not render any tasks given a task renders a row renders an object renders the task class renders the task class renders the task status renders the task status given a task that fetches content renders the path to the subject page renders the path to the subject page renders the task status renders the task status renders the subject renders the subject with a subject renders the subject renders the subject that is complete does not render the task does not render the task does not render any empty cells OutboxesController POST /actors/:username/outbox returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 403 if not the current account returns 403 if not the current account returns 400 if activity type is not supported returns 400 if activity type is not supported on announce returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an announce activity creates an announce activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply puts the object in the actor's timeline puts the object in the actor's timeline on like returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a like activity creates a like activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on dislike returns 400 if the object iri is missing returns 400 if the object iri is missing returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates a dislike activity creates a dislike activity does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public addresses (to) the public collection addresses (to) the public collection addresses (to) the object's actor addresses (to) the object's actor addresses (to) the actor's followers collection addresses (to) the actor's followers collection puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox does not put the object in the actor's timeline does not put the object in the actor's timeline on publish returns 400 if the content is missing returns 400 if the content is missing when validation fails returns 422 returns 422 renders an error message renders an error message redirects when successful returns 201 when successful redirects to the threaded view redirects to the object view specifies the location of the activity creates a create activity creates a create activity creates a note object creates a note object given a language sets the language sets the language given a name sets the name sets the name given a summary sets the summary sets the summary given a canonical path sets the canonical path sets the canonical path when a draft object is specified creates a create activity creates a create activity does not create an object does not create an object does not change the iri does not change the iri changes the published timestamp changes the published timestamp does not change the updated timestamp does not change the updated timestamp returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account when a published object is specified creates an update activity creates an update activity does not create an object does not create an object does not change the iri does not change the iri does not change the published timestamp does not change the published timestamp changes the updated timestamp changes the updated timestamp changes the content changes the content changes the object replied to changes the object replied to returns 400 if object does not exist returns 400 if object does not exist returns 403 if attributed to another account returns 403 if attributed to another account does not create a visible activity if not public does not create a visible activity if not public creates a visible activity if public creates a visible activity if public does not create a visible object if not public does not create a visible object if not public creates a visible object if public creates a visible object if public includes the IRI of the replied to object includes the IRI of the replied to object sets the IRI of the replies collection sets the IRI of the replies collection returns 400 if the replied to object does not exist returns 400 if the replied to object does not exist addresses (to) the specified actor addresses (to) the specified actor addresses (cc) all mentioned actors addresses (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (to) the specified actor and (cc) all mentioned actors addresses (cc) the specified actor addresses (cc) the specified actor addresses (to) the public collection addresses (to) the public collection does not address the public collection when visibility is private does not address the public collection when visibility is private does not address the public collection when visibility is direct does not address the public collection when visibility is direct addresses (to) the actor's followers collection addresses (to) the actor's followers collection does not address the actor's followers when visibility is direct does not address the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct does not address (cc) the actor's followers when visibility is direct addresses (to) the replied to object's attributed to actor addresses (to) the replied to object's attributed to actor enhances the content enhances the content enhances the content enhances the content puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox puts the object in the actor's timeline puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline does not put the object in the actor's timeline and the object is a reply does not put the object in the actor's timeline does not put the object in the actor's timeline on follow returns 400 if object does not exist returns 400 if object does not exist redirects when successful returns 201 when successful creates an unconfirmed follow relationship creates an unconfirmed follow relationship creates a follow activity creates a follow activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the object's outbox sends the activity to the object's outbox does not put the object in the actor's timeline does not put the object in the actor's timeline on accept returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates an accept activity creates an accept activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on reject returns 400 if a follow activity does not exist return 400 if a follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist confirms the follow relationship confirms the follow relationship creates a reject activity creates a reject activity puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing an announce returns 400 if the announce activity does not exist returns 400 if the announce activity does not exist returns 400 if the announce activity does not belong to the actor returns 400 if the announce activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the announce undoes the announce puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a like returns 400 if the like activity does not exist returns 400 if the like activity does not exist returns 400 if the like activity does not belong to the actor returns 400 if the like activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the like undoes the like puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a dislike returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not exist returns 400 if the dislike activity does not belong to the actor returns 400 if the dislike activity does not belong to the actor addresses (cc) the actor's followers collection addresses (cc) the actor's followers collection undoes the dislike undoes the dislike puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox when undoing a follow returns 400 if the follow activity does not exist return 400 if the follow activity does not exist returns 400 if the follow activity does not belong to the actor returns 400 if the follow activity does not belong to the actor returns 400 if the relationship does not exist returns 400 if the relationship does not exist destroys the relationship destroys the relationship undoes the follow undoes the follow puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox on delete given an object returns 400 if the object does not exist returns 400 if the object does not exist returns 400 if the object is not local returns 400 if the object is not local returns 400 if the object was not attributed to the actor returns 400 if the object was not attributed to the actor redirects when successful redirects to the actor's home page redirects back returns 204 when successful deletes the object deletes the object puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox given an actor returns 400 if the actor does not exist returns 400 if the actor does not exist returns 400 if the actor is not local returns 400 if the actor is not local returns 400 if the actor is not the actor returns 400 if the actor is not the actor deletes the actor deletes the actor puts the activity in the actor's outbox puts the activity in the actor's outbox sends the activity to the other's inbox sends the activity to the other's inbox GET /actors/:username/outbox returns 401 if not authorized when authorized returns 404 if not found returns 403 if not the current account succeeds LookupsController GET /lookup/actor returns 401 if not authorized when authorized returns 400 returns 404 redirects to the actor GET /lookup/object returns 401 if not authorized when authorized returns 400 returns 404 given a cached object redirects to the object GET /lookup/activity returns 401 if not authorized when authorized returns 400 returns 404 given a cached activity redirects to the activity ObjectsController .get_object returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects when authenticated returns visible objects returns visible reply objects given a not-visible reply returns nil for non-visible objects returns nil for non-visible objects returns nil for draft objects and account actor is the object owner returns non-visible objects owned by the actor returns draft objects owned by the actor returns reply objects owned by the actor and object is in account actor's inbox returns non-visible objects in the actor's inbox returns draft objects in the actor's inbox returns reply objects in the actor's inbox .get_object_editable returns nil when authenticated returns nil for objects not owned by the account actor and account actor is the object owner returns visible objects returns non-visible objects returns draft objects .get_object_approvable returns nil when authenticated returns nil when user does not own the thread root and user owns the thread root returns the reply returns nil for objects that are not replies POST /objects returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds creates an object creates an object when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message GET /objects/:id succeeds succeeds renders the object renders the object succeeds with a visible reply succeeds with a visible reply given a not-visible reply returns 404 returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote GET /objects/:id/replies succeeds renders an empty collection with a reply renders an empty collection that is approved renders an empty collection and is visible renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist GET /objects/:id/thread succeeds succeeds renders the collection renders the collection returns 404 if object is a draft returns 404 if object is not visible returns 404 if object is remote returns 404 if object does not exist when authorized redirects if draft but not the author returns 404 and it's in the user's inbox succeeds if local succeeds if local returns 404 if object is remote with a reply renders the collection renders the collection that is approved renders the collection renders the collection and is visible renders the collection renders the collection GET /objects/:id/edit returns 401 if not authorized when authorized given a draft post succeeds succeeds renders a form with the object renders a button that submits to the outbox path renders a button that submits to the object update path renders a textarea with the draft content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path given a published post succeeds succeeds renders a form with the object renders a button that submits to the outbox path does not render a button that submits to the object update path renders a textarea with the content renders the content with a name renders an input with the name renders the name with a summary renders a textarea with the summary renders the summary with a canonical path renders an input with the canonical path renders the canonical path returns 404 if not attributed to actor returns 404 if object does not exist POST /objects/:id returns 401 if not authorized when authorized succeeds witihout Turbo Streams redirects succeeds changes the content changes the content updates the language updates the language updates the name updates the name updates the summary updates the summary updates the canonical path updates the canonical path when validation fails returns 422 if validation fails returns 422 if validation fails renders an error message renders an error message returns 404 if not a draft returns 404 if object does not exist DELETE /objects/:id returns 401 if not authorized when authorized succeeds succeeds deletes the object deletes the object returns 404 if not a draft returns 404 if object does not exist GET /remote/objects/:id returns 401 if not authorized when authorized succeeds succeeds renders the object renders the object returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object does not exist and it's in the user's inbox succeeds succeeds GET /remote/objects/:id/thread returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/thread/analysis returns 401 when authorized succeeds succeeds renders the contributors renders the contributors renders the timeline renders the timeline renders the branches renders the branches returns 404 if object is not visible returns 404 if object is remote GET /remote/objects/:id/branch returns 401 when authorized succeeds succeeds renders the collection renders the collection returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist and it's in the user's inbox succeeds succeeds with replies renders the collection renders the collection GET /remote/objects/:id/reply returns 401 when authorized succeeds renders the object renders the form prepopulates editor with mentions returns 404 if object is not visible returns 404 if object is remote if remote object is visible succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/approve returns 401 when authorized succeeds approves the object but it's already approved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/unapprove returns 401 when authorized succeeds unapproves the object but it's already unapproved returns 400 returns 404 if object does not exist returns 404 if object is not a reply returns 404 when user does not own the thread root POST /remote/objects/:id/block returns 401 when authorized succeeds blocks the object returns 404 if object does not exist POST /remote/objects/:id/unblock returns 401 when authorized succeeds unblocks the object returns 404 if object does not exist POST /remote/objects/:id/follow returns 401 when authorized succeeds follows the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds follows the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/unfollow returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds unfollows the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds unfollows the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/start returns 401 when authorized succeeds does not follow the thread begins fetching the thread within a turbo-frame succeeds given a reply succeeds does not follow the thread begins fetching the thread given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/fetch/cancel returns 401 when authorized succeeds within a turbo-frame succeeds given a follow and fetch succeeds does not unfollow the thread stops fetching the thread within a turbo-frame succeeds given a reply succeeds does not unfollow the root object of the thread stops fetching the root object of the thread within a turbo-frame succeeds returns 404 if object is draft returns 404 if object does not exist POST /remote/objects/:id/translation/create returns 401 when authorized succeeds does not create a translation given a translator does not create a translation and an account and an object with the same primary language does not create a translation and an account and an object with different languages creates a translation returns 404 if object does not exist POST /remote/objects/:id/translation/clear returns 401 when authorized succeeds destroys the translation returns 404 if object does not exist SystemController GET /system returns 401 if not authorized when authorized succeeds given a source of logs renders an input renders an object and a log level renders the log level renders the log level POST /system returns 401 if not authorized when authorized redirects given a source of logs sets the log level sets the log level and a log level resets the log level resets the log level StreamingController GET /stream/mentions/:mention returns 401 if not authorized when authorized returns 404 if the mention does not exist GET /stream/tags/:hashtag returns 401 if not authorized when authorized returns 404 if the hashtag does not exist GET /stream/objects/:id/thread returns 401 if not authorized when authorized returns 404 if the object does not exist GET /stream/actors/:id returns 401 if not authorized when authorized returns 404 if the actor does not exist GET /stream/actor/homepage returns 401 if not authorized GET /stream/everything returns 401 if not authorized .replace_actor_icon renders a Turbo Stream action .replace_notifications_count renders Turbo Stream actions .replace_refresh_posts_message renders a Turbo Stream action .setup_response sets Content-Type sets Cache-Control sets X-Accel-Buffering .stream_action sends the body in a Turbo Stream / Server-Sent Events wrapper sends the body in a Turbo Stream / Server-Sent Events wrapper sets the id resets the id StreamingController::ConnectionPool initialization creates a new pool #capacity returns the capacity of the pool #size returns the number of connections in the pool #push adds the connection to the pool given a pool at capacity adds the connection to the pool does not change the capacity of the pool does not change the size of the pool when a new connection is added removes the oldest connection from the pool closes the removed connection ActivityPub::Object given a topic updates subjects when thread changes given an existing topic updates subjects when thread changes TagsController GET /tags/:hashtag succeeds succeeds renders the collection renders the collection renders the collection renders the collection if authenticated renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page includes turbo-stream-source on page=1 returns 404 if no tagged objects exist POST /tags/:hashtag/follow returns 401 when authenticated succeeds follows the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/unfollow returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds unfollows the tag stops fetching the hashtag returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/start returns 401 when authenticated succeeds does not follow the tag begins fetching the tag within a turbo-frame succeeds given an existing follow and fetch succeeds does not change the count of follow relationships does not change the count of fetch tasks where the fetch is complete but has failed clears the backtrace returns 404 if no tagged objects exist POST /tags/:hashtag/fetch/cancel returns 401 when authenticated succeeds within a turbo-frame succeeds given a follow and a fetch succeeds does not unfollow the tag stops fetching the hashtag returns 404 if no tagged objects exist ActivitiesController .get_activity returns visible activities returns nil for non-visible activities when authenticated returns visible activities returns nil for non-visible activities and account actor is the actor returns non-visible activities owned by the actor and activity is in account actor's inbox returns non-visible activities in the actor's inbox GET /activities/:id renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist when the user is the owner renders the activity returns 404 if activity is remote GET /remote/activities/:id returns 401 if not authorized when authorized renders the activity returns 404 if activity is not visible returns 404 if activity is remote returns 404 if activity does not exist and the user is the owner renders the activity renders the activity MetricsController::Chart .labels returns the labels at hourly granularity returns the labels at daily granularity returns the labels at weekly granularity returns the labels at monthly granularity returns the labels at yearly granularity returns an empty collection #data returns the summated data at hourly granularity returns the averaged data at hourly granularity returns the summated data at daily granularity returns the averaged data at daily granularity returns the summated data at weekly granularity returns the averaged data at weekly granularity returns the summated data at monthly granularity returns the averaged data at monthly granularity returns the summated data at yearly granularity returns the averaged data at yearly granularity returns an empty collection DST bug returns tuesday .safe_at_beginning_of_week returns monday correctly handles dates at DST transitions at weekly granularity MetricsController GET /metrics returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders metrics chart renders metrics labels renders metrics datasets renders metrics data with an older chart ignores charts with no points in the date range ignores all charts when no points in the date range EverythingController GET /everything returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders the collection renders the collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages InboxesController POST /actors/:username/inbox returns 404 if account not found returns 503 if the server is shutting down returns 400 if activity is blank returns 400 if activity can't be verified returns 200 if activity was already received and processed returns 400 if the activity cannot be deserialized due to an unsupported type returns 400 if activity is not supported returns 400 if actor is not present does not save the activity on failure when unsigned retrieves the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the actor from the origin saves the actor saves the actor's public key is successful when signed does not retrieve the activity from the origin does not retrieve the actor from the origin saves the activity is successful and the actor is not cached retrieves the actor from the origin saves the actor saves the actor's public key is successful and the actor is embedded in the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is referenced by the activity retrieves the remote actor from the origin saves the actor saves the actor's public key is successful and the actor is cached but doesn't have a public key retrieves the actor from the origin updates the actor's public key is successful but the public key is wrong retrieves the activity from the origin does not retrieve the actor from the origin returns 400 if the activity can't be verified when the other actor is down marks the actor as up on announce returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply puts the object in the actor's timeline and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on like returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on dislike returns 400 if no object is included fetches object if remote doesn't fetch the object if embedded fetches the attributed to actor saves the object puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline on create returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded saves the object puts the activity in the actor's inbox does not put the activity in the actor's notifications puts the object in the actor's timeline and the object's already in the timeline does not put the object in the actor's timeline and the object's a reply to some object does not put the object in the actor's timeline and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications and the activity is addressed to the other's followers does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox and the activity is addressed to the public collection does not put the activity in the actor's inbox and the actor follows other puts the activity in the actor's inbox is successful on update returns 400 if no object is included returns 400 if object is not attributed to activity's actor fetches object if remote doesn't fetch the object if embedded updates the object puts the activity in the actor's inbox is successful signature is not valid but the remote object can be fetched checks for the existence of the object updates the saved object succeeds and the object's a reply to the actor's object puts the object in the actor's notifications and object mentions the actor puts the activity in the actor's notifications on follow returns 400 if actor is missing returns 400 if object is missing when object is this account creates an unconfirmed follow relationship puts the activity in the actor's inbox puts the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox when object is not this account does not create a follow relationship puts the activity in the actor's inbox does not put the activity in the actor's notifications does not put the object in the actor's timeline and activity isn't addressed puts the activity in the actor's inbox on accept returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not accepting the actor's follow accepts the relationship accepts the relationship even if previously received on reject returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if it's not rejecting the actor's follow rejects the relationship rejects the relationship even if previously received when undoing an announce returns 400 if related activity does not exist returns 400 if the announce and undo aren't from the same actor puts the activity in the actor's inbox marks the announce as undone succeeds a like returns 400 if related activity does not exist returns 400 if the like and undo aren't from the same actor puts the activity in the actor's inbox marks the like as undone succeeds a follow returns 400 if relationship does not exist returns 400 if related activity does not exist returns 400 if the follow to undo isn't for this actor returns 400 if the follow and undo aren't from the same actor puts the activity in the actor's inbox destroys the relationship marks the follow as undone succeeds when deleting an object returns 400 if the object does not exist returns 400 if the object isn't from the activity's actor marks the object as deleted succeeds and the object was a reply to the actor's object removes the reply notification and the object mentioned the actor removes the mention notification using a tombstone marks the object as deleted succeeds signature is not valid but the remote object no longer exists checks for the existence of the object marks the object as deleted succeeds an actor returns 400 if the actor does not exist returns 400 if the actor isn't the activity's actor marks the actor as deleted succeeds signature is not valid but the remote actor no longer exists checks for the existence of the actor marks the actor as deleted succeeds Lemmy compatibility wrapped Create activity (post) saves the inner Create activity saves the Object does not save the Announce wrapper is successful wrapped Create activity (comment) saves the inner Create activity saves the Note is successful wrapped Like activity saves the inner Like activity does not save the Announce wrapper is successful wrapped Dislike activity saves the inner Dislike activity does not save the Announce wrapper is successful wrapped Update activity saves the inner Update activity is successful wrapped Undo activity saves the inner Undo activity is successful wrapped Delete activity saves the inner Delete activity is successful unsupported wrapped activity type does not save the inner Follow activity returns 400 malformed wrapped activity returns 400 regular Announce (Mastodon boost) saves the activity is successful GET /actors/:username/inbox returns 401 if not authorized with authorized returns 404 if not found returns 403 if not the current account succeeds AdminController GET /admin returns 401 if not authorized when authorized and accepting HTML succeeds renders the admin dashboard renders links to admin functionality SearchesController GET /search returns 401 if not authorized returns 401 if not authorized when authorized presents a search form presents a search form given a username returns matching actors returns matching actors returns empty results when no matches found returns empty results when no matches found strips leading @ from username query strips leading @ from username query rejects queries longer than 100 characters rejects queries longer than 100 characters given a handle to an actor retrieves and saves an actor retrieves and saves an actor works with a leading @ if present works with a leading @ if present ignores surrounding whitespace if present ignores surrounding whitespace if present that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an actor retrieves and saves an actor retrieves and saves an actor that already exists updates the actor updates the actor presents a follow button with an existing follow presents an unfollow button with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given a URL to an object retrieves and saves an object retrieves and saves an object of an existing object updates the object updates the object presents a like button with an existing like presents an undo button of a local object doesn't fetch the object given a non-existent host returns 400 returns 400 given bad JSON returns 400 returns 400 ActorsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil .get_actor returns nil returns actor GET /actors/:username returns 404 if not found returns 404 if not found returns 200 if found returns 200 if found responds with HTML responds with JSON when authorized with no filters it renders all posts filters out shares from posts given a reply with no filters it renders all posts filters out replies from posts filter preferences stores filter preferences in session handles empty filters gracefully handles empty filters gracefully uses stored filters and redirects removes the query string clears stored filters filter preferences does not store filter preferences includes RSS feed discovery link in HTML head when unauthenticated GET /actors/:username/feed.rss returns 404 if not found returns correct content type returns valid RSS includes public posts in RSS feed GET /actors/:username/public-posts returns 404 if not found returns 404 if not found succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/posts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect renders the collection renders the collection GET /actors/:username/timeline returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp when author is the actor given a create renders the object's create aspect given an announce renders the object's announce aspect when author is not the actor given a create renders the object's create aspect given an announce renders the object's announce aspect given both a create and an announce outside of actor's mailbox renders the object without aspect given a create, and an announce outside of actor's mailbox renders the object's create aspect given an announce, and a create outside of actor's mailbox renders the object's announce aspect given a like renders the object without aspect and a create renders the object's create aspect and an announce renders the object's announce aspect renders an empty collection renders an empty collection turbo-stream-source pagination includes turbo-stream-source on first page excludes turbo-stream-source on subsequent pages GET /actors/:username/notifications returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds updates the last checked timestamp updates the last checked timestamp renders an empty collection renders an empty collection GET /actors/:username/drafts returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found returns 404 if different account returns 404 if different account succeeds succeeds renders the collection renders the collection GET /remote/actors/:id returns 401 if not authorized returns 401 if not authorized when authorized returns 404 if not found returns 404 if not found renders the actor renders the actor POST /remote/actors/:id/block returns 401 if not authorized when authorized returns 404 if not found succeeds blocks the actor POST /remote/actors/:id/unblock returns 401 if not authorized when authorized returns 404 if not found succeeds unblocks the actor POST /remote/actors/:id/refresh returns 401 if not authorized when authorized returns 404 if not found schedules the refresh task renders a turbo stream replace message it succeeds WellKnownController webfinger returns 400 if bad request returns 400 if bad request returns 400 if bad host returns 404 if not found returns 200 if found returns 200 if 'acct' URI scheme is missing returns 200 if 'https' URI scheme is used returns 200 if 'https' URI scheme is used returns the handle in the subject returns the handle in the subject if 'acct' URI scheme is missing returns the handle in the subject if 'https' URI scheme is used returns the handle in the subject if 'https' URI scheme is used returns aliases returns reference to the actor document returns reference to the profile page returns reference to the template returns 400 if bad host returns 200 if found returns 200 if 'https' URI scheme is used returns the domain in the subject returns the domain in the subject if 'https' URI scheme is used returns aliases returns reference to the template nodeinfo returns 200 returns reference to the nodeinfo document returns the version returns software returns protocols returns services returns open registrations returns usage with a recent activity returns MAU count of 1 returns metadata oauth-protected-resource returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-protected-resource/mcp returns 200 returns the resource identifier returns the authorization servers returns the scopes supported returns the bearer methods supported sets CORS headers sets the content type oauth-authorization-server returns 200 returns the issuer returns the registration endpoint returns the authorization endpoint returns the token endpoint returns the scopes supported returns the response types supported returns the grant types supported returns the token endpoint auth methods supported returns the code challenge methods supported sets CORS headers sets the content type RelationshipsController .get_account returns nil returns account .get_account_with_ownership returns nil returns nil when authenticated returns account given another account returns nil GET /actors/:username/:relationship returns 404 if actor does not exist returns 404 if actor does not exist when relationship is following when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is followers when unauthorized renders only the related public actors renders only the related public actors when authorized renders all the related actors renders all the related actors renders only the related public actors renders only the related public actors when relationship is likes when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects when relationship is shares when unauthorized returns 401 returns 401 when authorized renders all the related objects renders all the related objects Admin::OAuthClientsController GET /admin/oauth/clients returns 401 if not authorized when authorized succeeds renders client in a table POST /admin/oauth/clients returns 401 if not authorized when authorized creates a new OAuth client returns validation errors for blank client name returns validation errors for blank redirect URIs returns validation errors for invalid redirect URIs DELETE /admin/oauth/clients/:id returns 401 if not authorized when authorized deletes the OAuth client with associated access token deletes associated access token returns 404 for non-existent client Admin::OAuthTokensController GET /admin/oauth/tokens returns 401 if not authorized when authorized succeeds renders token in a table DELETE /admin/oauth/tokens/:id returns 401 if not authorized when authorized deletes the OAuth token returns 404 for non-existent token Admin::AccountsController GET /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account button renders accounts table includes the authenticated account returns accounts array given two registered accounts shows indicator only for the authenticated user returns all accounts GET /admin/accounts/new returns 401 if not authorized returns 401 if not authorized when authorized succeeds succeeds renders add account form returns empty account POST /admin/accounts returns 401 if not authorized returns 401 if not authorized when authorized creates a new account creates a new account rejects empty username rejects empty username rejects short password rejects short password rejects weak password rejects weak password creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Person creates a ActivityPub::Actor::Organization creates a ActivityPub::Actor::Organization rejects invalid actor type rejects invalid actor type InteractionsController GET /objects/:id/remote-foobar returns 404 GET /objects/:id/remote-reply returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message GET /objects/:id/remote-like renders the message GET /objects/:id/remote-share renders the message GET /actors/:username/remote-follow returns 404 if not found succeeds succeeds renders a form returns a template includes the target includes the target includes the action includes the action renders the message POST /remote-interaction returns 400 if target is missing returns 400 if target is missing returns 400 if action is missing returns 400 if action is missing renders an error if domain is missing returns an error if domain is missing renders an error if domain is blank returns an error if domain is blank retains the domain if domain doesn't exist retains the domain if domain doesn't exist redirects if succesful succeeds returns the remote location if successful returns the remote location if successful given a handle instead of a domain redirects if succesful succeeds returns the remote location if successful returns the remote location if successful GET /authorize-interaction returns 401 if not authorized when authorized returns 400 if the uri is missing returns 400 if the uri can't be dereferenced given an actor succeeds succeeds renders the remote actor returns the actor with a public key updates the public key that is local doesn't fetch the actor that is down marks the actor as up given an object succeeds succeeds renders the remote object returns the object that is local doesn't fetch the object HomeController on step 1 (set host and site names) GET / renders a form returns a template POST / rerenders if host is invalid rerenders if site is invalid rerenders if host is invalid rerenders if site is invalid sets host and redirects sets site and redirects sets host and redirects sets site and redirects on step 2 (create account) GET / renders a form returns a template POST / redirects if params are missing redirects if params are missing rerenders if params are invalid rerenders if params are invalid redirects and sets cookie creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor returns token creates account creates actor of type ActivityPub::Actor::Person by default creates actor of type ActivityPub::Actor::Organization associates account and actor when requesting the home page if unauthenticated GET / succeeds without a site description does not display site description with a site description displays site description includes RSS feed discovery link in HTML head renders a list of local actors when author is local given a create renders the object's create aspect given an announce renders the object's announce aspect given a create and an announce renders the object's create aspect when author is remote given a create and an announce renders the object's announce aspect if authenticated GET / redirects to the user's page redirects to the user's page POST / returns 404 returns 404 GET /feed.rss returns correct content type returns valid RSS includes public posts DesignSystemController GET /.design-system returns 401 if not authorized when authorized succeeds MCPController .protocol_version returns the client protocol version returns the latest protocol version the server supports .authenticate_request returns account authorization header is missing returns nil authorization header does not hold a bearer token returns nil access token does not include mcp scope returns nil access token is expired returns nil GET /mcp returns method not allowed POST /mcp with MCP initialize request returns proper MCP initialize response with invalid JSON returns parse error with unknown method returns method not found error with invalid content type returns 400 Ktistec::Open .open fetches the page follows redirects to page follows redirects to page fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors fails on errors given a remote object fetches the object fetches the object .open? returns nil on errors Ktistec::JSON_LD ::CONTEXTS loads stored contexts .expand returns a JSON document returns a JSON document returns a JSON document raises an error given JSON document with vocabulary #[] returns terms given JSON-LD document with embedded context #[] returns mapped terms given JSON-LD document with remote context #[] returns mapped terms given JSON-LD document with mixed context #[] returns mapped terms given JSON-LD document using compact IRIs #[] returns mapped terms returns mapped terms returns mapped terms given JSON-LD document with mapped keys #[] returns mapped terms given JSON-LD document with nested objects #[] returns mapped terms given JSON-LD document with natural language values #[] returns merged values given JSON-LD document with no natural language values #[] returns value as a map given JSON-LD document with uncached context #[] gently ignores the context given a context term without an id #[] ignores the invalid term given no context #[] assumes an activitystreams context applies given a URL to a locally hosted litepub schema #[] assumes a canonical litepub context applies .dig? returns the value cast to the specified type returns nil if key does not exist .dig_value? given a nested object returns the result of the block given an array of nested objects returns the result of the block on the first element .dig_values? given a nested object returns the result of the block as an array given an array of nested objects returns the result of the block on all elements .dig_id? given a nested object returns the identifier given a link returns the identifier given an identifier returns the identifier given an array of nested objects returns the first identifier given an array of links returns the first identifier given an array of identifiers returns the first identifier .dig_ids? given a nested object returns the identifier as an array given a link returns the identifier as an array given an identifier returns the identifier as an array given an array of nested objects returns all the identifiers given an array of links returns all the identifiers given an array of identifiers returns all the identifiers Ktistec::Controller GET /foo/bar/accepts responds with html responds with text responds with json responds with json responds with json GET /foo/bar/turbo-streams/:target/:operation responds with turbo-streams GET /foo/bar/turbo-streams/:target/:operation/:method responds with turbo-streams GET /foo/bar/turbo-stream responds with turbo-stream does not respond with turbo-stream POST /foo/bar/turbo-frame responds with turbo-frame does not respond with turbo-frame GET /foo/bar/redirect redirects with 301 sets the location header GET /foo/bar/created responds with 201 sets the location header includes the body GET /foo/bar/ok responds with json responds with text responds with html responds with json by default prefers json sets the content type sets the content type sets the content type Ktistec::Topic instantiation creates a new topic creates a topic with no subjects creates a topic with a subject creates a topic with two subjects finalization removes the topic's subjects #subjects returns the subjects of the topic given duplicate subjects returns each subject once #subscriptions returns the subscriptions given a subscription 2025-11-13T23:57:05.587380Z WARN - mcp: parse error: Unexpected char 'j' at line 1, column 13 2025-11-13T23:57:05.614387Z WARN - mcp: method not found: unknown/method 2025-11-13T23:57:06.249827Z NOTICE - ktistec.json_ld: uncached external context not loaded: https://uncached returns the subscriptions #<< adds a subject to the topic given a subject and a subscription raises an error given a subject and a notification raises an error #subscribe is invoked on timeout given a subject and a pending notification receives updates #notify_subscribers does not block given a subscription notifies the subscriber notifies the subscriber merges the notifications merges the notifications does not merge the notifications given a different subject does not notify the subscriber that is renamed notifies the subscriber given the same subject notifies the subscriber given a block that raises an error removes the subscription .rename_subject renames the subject renames the subject Ktistec::Topic::Subjects #map maps a value to the next storage location given existings mappings retrieves the storage location of existing mappings maps a new value to the next storage location that are cleared reuses the storage locations of cleared mappings #unmap unmaps values from their storage locations raises an error if the storage location is not mapped when mapped more than once does not unmap values from their storage locations and unmapped once unmaps values from their storage locations #clear clears the storage locations raises an error if the storage location is not mapped #[] retrieves the value at the storage location raises an error if the storage location is not mapped Ktistec::Auth get /foo/bar/auth anonymous session fails to authenticate fails to authenticate stores the path in the session doesn't store the path in the session doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session get /foo/bar/skip anonymous session doesn't authenticate but doesn't fail doesn't authenticate but doesn't fail doesn't store the path in the session authenticated session successfully authenticates successfully authenticates doesn't store the path in the session Ktistec::Database .all_migrations returns migrations .all_versions returns versions .all_applied_versions does not include test migration .all_pending_versions includes test migration .do_operation creates and destroys the migration applies and reverts the migration Ktistec::Database::Migration .columns returns the table's columns .indexes returns the table's indexes .add_column adds the column adds the index .remove_column removes the column removes the index retains the data Ktistec::Method post /foo/bar/delete invokes the delete action invokes the post action Ktistec::Model .table_name returns the table name returns the table name #table_name returns the table name returns the table name .values raises an error if column doesn't exist .conditions raises an error if column doesn't exist .all_subtypes returns type and all subtypes returns type and all subtypes excludes abstract types .query_and_paginate includes the additional columns .query_all includes the additional columns .query_one includes the additional columns .new creates a new instance bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns belongs_to associations raises an error if property type is wrong raises an error if property type is wrong raises an error if a non-nilable property is not assigned raises an error if a non-nilable property is not assigned does not raise an error if the non-nilable property is assigned via an alias does not raise an error if the non-nilable property is assigned via an association raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property #assign bulk assigns properties bulk assigns properties bulk assigns properties supports assignment of nil assigns belongs_to associations assigns has_one associations assigns has_many associations raises an error if property type is wrong raises an error if property type is wrong raises an error if strict is true and property is not a property raises an error if strict is true and property is not a property indicates the property value is changed indicates the property value is changed indicates the property value is not changed indicates the property value is not changed #== returns true if all properties are equal returns true if all properties are equal #hash returns the hash returns the hash .empty? returns true returns true .count returns the count of persisted instances returns the count of matching instances returns the count of matching instances returns the count of persisted instances returns the count of matching instances returns the count of matching instances .all returns all persisted instances returns all persisted instances .find given the id finds the saved instance finds the updated instance finds the saved instance raises an error given properties finds the saved instance finds the saved instance finds the updated instance finds the updated instance finds the saved instance finds the saved instance raises an error given associations finds the saved instance using the foreign key finds the saved instance using the foreign key finds the saved instance using the association finds the saved instance using the association when instantiating an abstract model raises an error .find? returns nil returns nil returns nil .find_or_new creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .find_or_create creates a new instance creates a new instance given an existing instance finds the saved instance finds the saved instance .where given properties returns the saved instances returns the saved instances returns the saved instances returns the updated instances returns the updated instances returns the updated instances returns the saved instances returns the saved instances returns the saved instances returns an empty collection returns an empty collection returns an empty collection returns an empty collection given associations returns the saved instances using the foreign key returns the saved instances using the foreign key returns the saved instances using the association returns the saved instances using the association .scalar returns the count of saved instances returns the count of saved instances .exec deletes the saved instances deletes the saved instances returns the count of rows affected returns the count of rows affected .sql given a saved instance returns the saved instances returns the saved instances returns an empty collection returns an empty collection #serialize_graph serializes the graph of models skips associated instances #valid? performs the validations performs the validations performs the validations even if unchanged if called directly passes the validations validates the associated instance validates the associated instance does not validate the associated instance does not validate the associated instance if it's unchanged before validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after validate lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #save new instance saves a new instance assigns an id saves a new instance with an assigned id saves a new instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception saves the properties saves the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance existing instance does not save a new instance does not assign an id does not save a new instance with an assigned id updates the instance even if unchanged if saved directly raises a validation exception doesn't raise a validation exception updates the properties updates the properties saves the associated instance doesn't save the associated instance doesn't save the associated instance if it's unchanged doesn't save the instance before create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record after create lifecycle callback runs the callback if a new record does not run the callback if not a new record runs the callback on associated instance if a new record does not run the callback on associated instance if it's not a new record before update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record after update lifecycle callback does not run the callback if a new record runs the callback if not a new record does not run the callback on associated instance if a new record runs the callback on associated instance if not a new record before save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged after save lifecycle callback runs the callback runs the callback even if unchanged if called directly runs the callback on associated instance does not run the callback on associated instance if it's unchanged #update_property raises an error if model is unsaved given a saved instance updates the property updates the saved property raises an error if property does not exist #destroy destroys the persisted instance before destroy lifecycle callback runs the callback after destroy lifecycle callback runs the callback #reload! reloads the model properties from the database given an association clears the model association clears the model association clears the changed status raises an error if not found raises an error if unsaved #new_record? returns true if the record has not been saved returns false if the record has been saved #changed? returns true if the record is new returns true if the record is new even if it was cleared returns false if the record has not been changed returns true if the record has been changed returns false if the record has been cleared after it was changed returns false if the record has been saved returns false if the record has been saved given a saved record returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried returns false if queried with inverse associations does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed does not mark inverse record as changed returns false if the property has not been changed returns true if the property has been changed returns false if the property has been cleared after it was changed returns true if the property has been changed #to_s returns a string representation #inspect returns a string representation #to_json returns the JSON representation #to_h returns the hash representation derived properties sets the aliased property gets the aliased property when queried via the aliased property returns the model associations belongs_to assigns the associated instance assigns the associated instance assigns the associated instance assigns the associated instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified updates the foreign key when saved updates the foreign key when saved has_many assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save destroys the last associated instance does not save through a destroyed instance does not save through a deleted instance includes a deleted instance if explicitly specified includes an undone instance if explicitly specified has_one assigns the inverse association assigns the inverse association does not destroy unassociated instances on assignment destroys unassociated instances on assignment and save does not save through a destroyed instance does not save through a deleted instance finds a deleted instance if explicitly specified finds a deleted instance if explicitly specified finds an undone instance if explicitly specified finds an undone instance if explicitly specified returns the correct instance returns the correct instance returns nil returns nil Ktistec::Model::Internal .to_sentence converts the type to a string converts the type to a string converts the types to a string converts the types to a string Ktistec::Util .id generates a random identifier .render_as_text ignores empty content removes inline markup replaces block elements with newlines leaves bare text alone leaves escaped content alone .sanitize ignores empty content removes forbidden tags and their content entirely replaces unsupported tags with their content preserves supported tags strips attributes preserves href on links, adds target and rel attributes to remote links preserves href on links, adds data-turbo-frame attribute to local links preserves href on paths, adds data-turbo-frame attribute preserves src and alt on images, adds loading attribute and compatibility classes preserves src on audio, adds controls attribute preserves src on video, adds controls attribute preserves 'invisible' in class attribute on span elements preserves 'ellipsis' in class attribute on span elements doesn't corrupt element order leaves bare text alone leaves escaped content alone .to_sentence returns an empty string returns the word returns the words in sentence form returns the words in sentence form uses the specified words connector uses the specified last word connector .distance_of_time_in_words test_pairs span: 00:00:14; words: "less than a minute" transforms the span of time into words span: 00:00:45; words: "1 minute" transforms the span of time into words span: 00:01:15; words: "1 minute" transforms the span of time into words span: 00:01:35; words: "2 minutes" transforms the span of time into words span: 00:14:00; words: "14 minutes" transforms the span of time into words span: 00:45:00; words: "about 1 hour" transforms the span of time into words span: 01:15:00; words: "about 1 hour" transforms the span of time into words span: 01:35:00; words: "about 2 hours" transforms the span of time into words span: 14:00:00; words: "14 hours" transforms the span of time into words span: 1.06:00:00; words: "about 1 day" transforms the span of time into words span: 1.16:00:00; words: "about 2 days" transforms the span of time into words span: 14.00:00:00; words: "14 days" transforms the span of time into words span: 40.00:00:00; words: "about 1 month" transforms the span of time into words span: 50.00:00:00; words: "about 2 months" transforms the span of time into words span: Time::MonthSpan(@value=10); words: "10 months" transforms the span of time into words span: Time::MonthSpan(@value=14); words: "about 1 year" transforms the span of time into words span: Time::MonthSpan(@value=18); words: "over 1 year" transforms the span of time into words span: Time::MonthSpan(@value=22); words: "almost 2 years" transforms the span of time into words span: Time::MonthSpan(@value=26); words: "about 2 years" transforms the span of time into words span: Time::MonthSpan(@value=30); words: "over 2 years" transforms the span of time into words span: Time::MonthSpan(@value=34); words: "almost 3 years" transforms the span of time into words .pluralize pluralizes the noun pluralizes the noun pluralizes the noun pluralizes the noun Ktistec::Util::PaginatedArray .more changes the indicator #map returns a paginated array returns a paginated array with the results of applying the supplied block returns an indication of whether there are more results Ktistec::CSRF sends GETs to next handler generates an authenticity token on HTML requests does not generate an authenticity token on non-HTML requests allows POSTs with safe content types blocks POSTs without the token allows POSTs with the correct token in FORM submit allows POSTs with the correct token in HTTP header allows POSTs to allowed route allows POSTs to allowed route using wildcards does not allow POSTs to mismatched route using wildcards outputs error string calls an error proc with context Ktistec::JWT .encode encodes the payload .decode decodes the token raises an error if the token is not well-formed raises an error if the token is not encoded correctly raise an error if the signature is not correct .expired? returns true if payload is expired returns false if payload is not expired Ktistec::Rewrite get /@foobar rewrites the request get /%40foobar rewrites the request Ktistec::Rule .make_pattern inherits from School::Pattern given a pattern class #vars returns the vars returns the vars returns the vars returns the vars returns the vars and a database and models #match with no arguments invokes the block once for each match does not bind values with an undefined argument raises an error with a lit target that matches a model invokes the block once does not bind values with a lit target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var target invokes the block once for each match binds the target to each match with a bound var target that matches a model invokes the block once binds the target to the match with a bound var target that does not match a model does not invoke the block does not bind values does not invoke the block does not bind values with a not target invokes the block once for each match binds the target to each match invokes the block once for each match binds the target to each match with a within target invokes the block once for each match binds the target to each match does not invoke the block does not bind values with a lit association that matches a model invokes the block once does not bind values with a lit association that does not match a model does not invoke the block does not bind values with an unbound var association invokes the block once for each match binds the association to each match with a bound var association that matches a model invokes the block once binds the match with a bound var association that does not match a model does not invoke the block does not bind values with a not association invokes the block once binds the match invokes the block once binds the match with a within association invokes the block once binds the match invokes the block once binds the match with a lit property that matches a model value invokes the block once does not bind values with a lit property that matches a model value through accessor invokes the block once does not bind values with a lit property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with an unbound var property invokes the block once for each match binds the property value to each match with a bound var property that matches a model value invokes the block once binds the match with a bound var property that does not match a model value does not invoke the block does not bind values does not invoke the block does not bind values with a not property invokes the block twice binds the match invokes the block twice binds the match with a within property invokes the block twice binds the match invokes the block twice binds the match with a property and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property and the predicate 'filter' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a property, the predicate 'filter', and the function 'strip' invokes the block once binds the match invokes the block once binds the match invokes the block once binds the match with a wildcard invokes the block once binds the match with an escaped wildcard invokes the block once binds the match with an escaped escape invokes the block once binds the match via a derived property invokes the block once binds the match with a target with a cached association invokes the block once binds the association with a target with an uncached association does not invoke the block does not bind values with a target with a non-nil property invokes the block once binds the association with a target with a nil property does not invoke the block does not bind values with a target that is a parent of the rule pattern class does not invoke the block does not bind the name with a target that is an alias of the rule pattern class invokes the block once binds the name .assert creates an instance creates an instance .retract destroys an instance destroys an instance Ktistec::Signature .sign returns headers includes a signature includes digest header if the body is supplied does not include digest header if the body is not supplied includes content type header if content type is supplied does not include content type header if content type is not supplied includes content length header if content length is supplied does not include content length header if content length is not supplied includes accept header if accept is supplied does not include accept header if accept is not supplied with hs2019 sets the algorithm signature parameter to 'rsa-sha256' sets the created signature parameter sets the expires signature parameter includes (created) in the headers signature parameter includes (expires) in the headers signature parameter with rsa-sha256 sets the algorithm signature parameter to 'rsa-sha256' includes date in the headers signature parameter .verify raises an error if the signature header is not present raises an error if the signature header is malformed raises an error if the signing keys don't match raises an error if the host header isn't signed raises an error if the host doesn't match raises an error if the port doesn't match given a non-standard port raises an error if the port doesn't match verifies signature raises an error if the (request-target) header isn't signed raises an error if the request target path doesn't match raises an error if the request target method doesn't match with hs2019 raises an error if the (created) header doesn't match raises an error if the (expires) header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature with rsa-sha256 raises an error if the (created) header is included raises an error if the (expires) header is included raises an error if the date header doesn't match raises an error if date is out of range raises an error if date is out of range verifies signature raises an error if neither the (created) header nor the date header is included raises an error if the digest header isn't signed raises an error if the digest header doesn't match raises an error if the body digest doesn't match raises an error if the content type header doesn't match raises an error if the content length header doesn't match raises an error if the accept header doesn't match SQLite3 extensions given an array deserializes a read serializes a write given JSON deserializes a read serializes a write deserializes a read serializes a write deserializes a read serializes a write strip strips the markup strips the markup strips the markup HTTP::Server::Context creates a new session returns the session token in a cookie anonymous session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session authenticated session uses an existing session with expired token creates a new session with invalid token creates a new session with new secret key creates a new session Ktistec::LogLevel #save persists the instance to the database #destroy removes the instance from the database #all_as_hash returns all log levels as a hash Ktistec::Settings initializes instance from the persisted values #assign sets the host sets the site sets the description sets the footer increments the nonce #save persists assigned values to the database #valid? expects host to be present expects host to specify a scheme expects host to specify a host name expects host not to specify a path expects host not to specify a fragment expects hosts not to specify a query expects site to be present expects translator service to be valid expects translator URL to specify a scheme expects translator URL to specify a host name expects translator URL not to specify a fragment Ktistec::Server .shutdown returns true Ktistec ::VERSION should return the version .settings returns the settings singleton given previous errors clears the errors when getting the settings singleton .translator returns nil when the translator service is not configured given invalid settings returns nil when the translator service is not supported given settings for the DeepL translator returns nil when the API key is missing given an API key returns a DeepL translator caches the translator given a configured translator instantiates a new translator when the settings change given settings for the LibreTranslate translator returns nil when the API key is missing given an API key returns a LibreTranslate translator caches the translator given a configured translator instantiates a new translator when the settings change given initialized settings .host returns the host .site returns the site .description generates description convenience method .footer returns the footer Ktistec::Themes .css_tags with no CSS files returns empty string with multiple CSS files generates CSS link tags in sorted order with files containing special characters properly escapes file names .js_tags with no JS files returns empty string with multiple JS files generates script tags in sorted order with files containing special characters properly escapes file names .discover_files handles missing themes directory gracefully discovers CSS and JS files in themes directory clears existing files before discovery Ktistec::Model::Undoable .new includes Ktistec::Model::Undoable #undo! undoes the instance sets undone_at an undone record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included an undone instance won't be validated won't be saved Ktistec::Model::Polymorphic .new includes Ktistec::Model::Polymorphic .count returns the count returns the count for subclass .all finds all instances finds all instances of subclass .where finds all matching instances does not find any matching instances of subclass .find finds the matching instance finds the matching instance of subclass returns the correct subclass populates the uninherited properties of subclass populates the uninherited properties of subclass populates the uninherited properties of subclass raises an error raises an error when instantiating an abstract model raises an error raises an error .all_subtypes includes the alias #as_a returns the correct subclass raises an error #valid? returns false if the type is invalid Ktistec::Model::Common .new includes Ktistec::Model::Common timestamps sets created_at sets updated_at does not change created_at changes updated_at Ktistec::Model::Deletable .new includes Ktistec::Model::Deletable #delete! deletes the instance sets deleted_at a deleted record isn't counted isn't counted unless explicitly included isn't counted isn't counted unless explicitly included isn't returned isn't returned unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included can't be found can't be found unless explicitly included a deleted instance won't be validated won't be saved timeline partial timeline.html.slang renders an empty page renders a stream source given a query string renders a stream source with the query string timeline.json.ecr renders an empty collection notifications partial notifications.html.slang renders an empty page given an announce notification renders a sharing message given another announce notification renders a sharing message given a like notification renders a liking message given another like notification renders a liking message given a dislike notification renders a disliking message given another dislike notification renders a disliking message given a mention notification renders a message given a follow hashtag notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a follow mention notification renders a message renders the content given a deleted object does not render the content given a blocked object does not render the content given a thread follow notification for a reply renders a replied to message given a thread thread notification for the root renders a fetch the root of the thread message notifications.json.ecr renders an empty collection object partials label.html.slang the actor is the author renders one profile icon and the author is deleted renders an empty icon and the author is blocked renders an empty icon the actor is not the author renders two profile icons and the actor is deleted renders an empty icon and the actor is blocked renders an empty icon content.html.slang given HTML content renders the content as is and a translation renders the translation of the content given Markdown content renders the content as HTML and a translation renders the translation of the content given a name renders the name and a translation renders the translation of the name given a summary renders the summary as plain text and a translation renders the translation of the summary as plain text given an attachment renders the attachment does not render a button to translate the content does not render a button to clear the translation when authenticated does not render a button to translate the content does not render a button to clear the translation given a translator does not render a button to translate the content and an account and an object with the same primary language does not render a button to translate the content and an account and an object with different languages renders a button to translate the content given a translation renders a button to clear the translation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when authenticated renders a button to the threaded conversation renders a button to the threaded conversation renders a button to the threaded conversation when viewing a thread does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation does not render a button to the threaded conversation when viewing details renders a button to the threaded conversation given hashtags with the same name renders one hashtag given mentions with the same name renders one mention given mentions with different names but the same handle renders two mentions given mentions with different names renders two mentions if approved renders a button to the threaded conversation renders a button to the threaded conversation when is draft does not render a button to edit when authenticated does not render a button to reply does not render a button to like does not render a button to share renders a button to delete renders a button to edit when author is deleted indicates the author is deleted when authenticated indicates the author is deleted given an author that is not the actor when author is deleted indicates the author is deleted when authenticated indicates the author is deleted when actor is deleted indicates the actor is deleted when authenticated indicates the actor is deleted when object is deleted indicates the object is deleted when author is blocked indicates the author is blocked when authenticated indicates the author is blocked given an author that is not the actor when author is blocked indicates the author is blocked when authenticated indicates the author is blocked when actor is blocked indicates the actor is blocked when authenticated indicates the actor is blocked when object is blocked indicates the object is blocked does not render a button to block does not render a button to unblock when is remote does not render a button to block does not render a button to unblock when authenticated renders a button to block does not render a button to unblock if object is blocked does not render a button to block renders a button to unblock and object has been announced does not render a button to block and object has been liked does not render a button to block when in reply to a post by the account's actor does not render a checkbox does not render a checkbox when authenticated renders a checkbox renders a checkbox expects the checkbox not to be checked expects the checkbox to be checked if object content is externally hosted renders link to the external content if object content is not externally hosted renders name of the object object_partial renders the activity type as a class when with detail renders the activity type as a class when in a thread renders the activity type as a class thread.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the thread given a follow renders a button to unfollow the thread does not render information about the task given a task renders information about the task partials collection.json.ecr when paginated renders a collection page contains the id of the collection page contains a page of items does not contain navigation links and on the second page contains a link to the previous page and contains more contains a link to the next page when not paginated renders a collection contains the id of the collection does not contain any items contains the first collection page contains the first collection page contains the first collection page of items does not contain navigation links and contains more contains a link to the next page tag_page_tag_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button thread_page_thread_controls.html.slang renders a follow and a fetch button given a follow renders an unfollow button given a destroyed follow does not render an unfollow button given a task renders a cancel button given a complete task does not render a cancel button given a thread with <10 posts does not render the full analysis link given a thread with 10+ posts renders the full analysis link given a fetch task does not render the full analysis link that is not running renders the full analysis link actor-panel.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow and actor is down does not render a down warning message if authenticated renders an internal link to the actor and account actor is actor does not render buttons and following actor renders a button to unfollow does not render a button to block when follow request is pending displays pending follow request status when follow request was accepted displays accepted follow request status with timestamp when follow request was rejected displays rejected follow request status with timestamp renders a button to follow having not accepted or rejected a follow renders a button to accept renders a button to reject renders a button to follow renders a button to block having accepted a follow does not render a button to accept does not render a button to reject renders a button to reject instead renders a button to follow renders a button to block having rejected a follow does not render a button to accept does not render a button to reject does not render a button to reject instead renders a button to accept now renders a button to follow renders a button to block and actor is blocked renders a button to unblock does not render a button to follow renders a blocked message segment does not render a blocked message segment renders a button to block renders a button to refresh renders the last refresh time and actor is down renders a down warning message actor-card.html.slang if anonymous does not render an internal link to the actor does not render buttons and actor is local renders a button to remote follow if authenticated renders an internal link to the actor if account actor is actor does not render buttons and on a page of actors the actor is following if already following renders a button to unfollow renders a button to follow having not accepted or rejected a follow if following renders a button to accept renders a button to reject renders a button to block renders a button to accept renders a button to reject renders a button to block having accepted or rejected a follow if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block if following renders a button to unfollow does not render a button to block renders a button to follow renders a button to block editor.html.slang if authenticated given a new object renders an id does not render an input with the object iri includes an input to create draft does not include a link to return to drafts uses the default language if no default language is set does not render an input for language given an assigned language uses the assigned language given a saved object renders an id renders an input with the object iri given a reply renders an input with the replied to object's iri prepopulates editor with mentions does not render details includes an input to send reply given a self-reply does not self-mention given a draft object includes an input to publish post includes an input to update draft includes a link to return to drafts given a published object includes an input to update post does not include an input to save draft does not include a link to return to drafts visibility renders the public checkbox as checked given an object with addressing when it is addressed to a specific actor renders the direct checkbox as checked when it is addressed to the author's followers renders the private checkbox as checked an object with errors renders the error class editor.json.ecr if authenticated given a new object does not render the object's iri uses the default language if no default language is set does not render a key for language given an assigned language uses the assigned language given a saved object renders the object's iri given a reply renders the replies to object's iri visibility renders public visibility given an object with addressing when it is addressed to a specific actor renders direct visibility when it is addressed to the author's followers renders private visibility an object with errors renders the errors FooBarController GET /foo/bar/id_param/:id is not successful for non-numeric parameters is successful for numeric parameters it returns the id of the resource GET /foo/bar/iri_param/:id is not successful for invalid parameters is successful for valid parameters it returns the IRI of the resource helpers paginate does not render pagination controls with more pages renders the next link on the second page renders the prev link .addressing when visibility is public puts public collection in to field puts followers collection in cc field returns visible as true when visibility is private puts followers collection in to field does not put followers collection in cc field returns visible as false when visibility is direct does not put anything in to field does not put anything in cc field returns visible as false .visibility when object addresses the public collection returns public returns public when object addresses the followers collection returns private returns private when object addresses neither the public collection nor the followers collection returns direct when both to and cc are empty arrays returns direct when both to and cc are nil and object is not a reply returns public and object is a reply and parent addresses the public collection returns public returns public and parent addresses the followers collection returns direct returns direct .wrap_link wraps the link in an anchor wraps the scheme in an invisible span does not include the host and path in an ellipsis span given a very long link wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with length specified wraps the truncated host and path in an ellipsis span wraps the remainder in an invisible span with scheme included does not wrap the scheme in an invisible span includes the scheme with the host and path with tag specified wraps the link in the tag given a string returns the string .wrap_filter_term wraps a filter term in a span wraps a wildcard % in a span wraps a wildcard _ in a span wraps an escaped wildcard % in a span wraps an escaped wildcard _ in a span does not wrap text activity_button emits a form with nested content emits a form with a csrf token emits a form with a hidden input specifying the object emits a form with a hidden input specifying the type emits a form with a hidden input specifying the visibility specifies the action specifies the method specifies the form class specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token form_button emits a form with nested content emits a form with a csrf token specifies the action specifies the method specifies the form id  specifies the form class specifies the button id specifies the button class without a body emits a form with nested content given data attributes emits form data attributes emits button data attributes given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token authenticity_token emits input tag with the authenticity token error_messages emits nested div containing error message form_tag emits a form with nested content emits a form with a csrf token specifies the action specifies the method sets the error class when specifying form data sets the enctype when specifying form urlencoded sets the enctype given data attributes emits data attributes given a nil model does not set the error class given a DELETE method emits a hidden input sets the method to POST given a GET method does not emit a csrf token sets the method to GET input_tag emits div containing label and input tags emits a label tag with the label text emits an input tag with the specified name emits an input tag with the associated value specifies the id specifies the class overrides the default type specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits an input tag with the specified name does not set the error class given a value with an ampersand and quotes emits an input tag with the associated value given autofocus specifies the autofocus attribute textarea_tag emits div containing label and textarea tags emits a label tag with the label text emits a textarea tag with the specified name emits a textarea tag with the associated text specifies the id specifies the class overrides the default rows specifies the placeholder sets the error class given data attributes emits data attributes given a nil model emits a textarea tag with the specified name does not set the error class given a value with HTML characters emits a textarea tag with the associated value given autofocus specifies the autofocus attribute select_tag emits div containing label and select tags emits a label tag with the label text emits a select tag with the specified name emits option tags with the specified values emits option tags with the specified text given a field value that matches an option emits an option tag with the option selected given a selected value that matches an option emits an option tag with the option selected specifies the id specifies the class sets the error class given data attributes emits data attributes given a nil model emits a select tag with the specified name does not set the error class trix_editor emits div containing label, trix-editor and textarea tags includes data-turbo-permanent on field emits a label tag with the label text emits a trix-editor with the specified input attribute specifies the custom class on trix-editor emits a textarea with the associated value emits a textarea with the specified id emits a textarea with the specified name sets the error class given a nil model does not set the error class submit_button emits an input of type submit specifies the value specifies the class params_to_inputs emits hidden fields emits hidden field emits hidden field emits hidden field activity_pub_collection generates a JSON-LD document is an ordered collection nests the first page of items the first page of items is an ordered collection page includes an ordered collection of items does not include a link to the next page with more pages includes a link to the next page the second page of items is an ordered collection page includes an ordered collection of items includes a link to the previous page does not include a link to the previous page with more pages includes a link to the next page error_block emits a block of errors field_pair emits a key/value pair task_status_line given a task that is complete returns nil given a task that is running returns the status given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task that has failed returns the status fetch_task_status_line given a task that is complete returns nil given a task that is running returns the status and a collection of published objects includes status of most recent post given a task that hasn't run returns the status given a task that is ready to run returns the status given a task that will run returns the status when detail is true given a task that previously ran returns the status given a task with a successful fetch returns the status given a task that has failed returns the status host returns the host sanitize sanitizes HTML render_as_text strips all HTML pluralize pluralizes the noun does not pluralize the noun pluralizes the noun comma emits a comma does not emit a comma markdown_to_html transforms Markdown to HTML id generates an id pagination_params ensures page is at least 1 ignores negative page numbers when user is not authenticated allows size up to 20 limits size to 20 uses default size of 10 when no size specified uses requested size when under the limit when user is authenticated allows size up to 1000 limits size to 1000 uses default size of 10 when no size specified uses requested size when under the limit back_path gets the back path home_path gets the home path sessions_path gets the sessions path search_path gets the search path settings_path gets the settings path filters_path gets the filters path filter_path given a term gets the filter path gets the filter path system_path gets the system path metrics_path gets the metrics path tasks_path gets the tasks path remote_activity_path given an activity gets the remote activity path gets the remote activity path activity_path given an activity gets the activity path gets the activity path anchor given an object gets the anchor gets the anchor objects_path gets the objects path remote_object_path given an object gets the remote object path gets the remote object path object_path given an object gets the object path gets the object path remote_thread_path given an object gets the remote thread path gets the remote thread path thread_path given an object gets the thread path gets the thread path edit_object_path given an object gets the edit object path gets the edit object path reply_path given an object gets the reply path gets the reply path approve_path given an object gets the approve path gets the approve path unapprove_path given an object gets the unapprove path gets the unapprove path block_object_path given an object gets the block object path gets the block object path unblock_object_path given an object gets the unblock object path gets the unblock object path object_remote_reply_path given an object gets the object remote reply path gets the object remote reply path object_remote_like_path given an object gets the object remote like path gets the object remote like path object_remote_share_path given an object gets the object remote share path gets the object remote share path create_translation_object_path given an object gets the create translation object path gets the create translation object path clear_translation_object_path given an object gets the clear translation object path gets the clear translation object path remote_actor_path given an actor gets the remote actor path gets the remote actor path actor_path given an actor gets the actor path gets the actor path block_actor_path given an actor gets the block actor path gets the block actor path unblock_actor_path given an actor gets the unblock actor path gets the unblock actor path actor_relationships_path given an actor and a relationship gets the actor relationships path gets the actor relationships path outbox_path given an actor gets the outbox path gets the outbox path inbox_path given an actor gets the inbox path gets the inbox path actor_remote_follow_path given an actor gets the actor remote follow path gets the actor remote follow path hashtag_path given a hashtag gets the hashtag path gets the hashtag path mention_path given a mention gets the mention path gets the mentions path remote_interaction_path gets the remote interaction path index.html.slang does not render a button to follow the mention given a follow does not render a button to unfollow the mention if authenticated renders a button to follow the mention given a follow renders a button to unfollow the mention actor actor.html.slang does not render an editor if authenticated does not render an editor if account actor is actor renders an editor index.html.slang does not render turbo-stream-source tag does not render any controls given a follow does not render any controls does not render information about the task given a task does not render information about the task if authenticated renders turbo-stream-source tag renders a button to follow the hashtag given a follow renders a button to unfollow the hashtag does not render information about the task given a task renders information about the task Themes Integration discovers theme files and includes them in layout OAuth2::Provider::Client has many access tokens validations validates client name is present validates redirect URIs is present validates redirect URIs have valid format validates redirect URIs have scheme validates redirect URIs have host validates multiple redirect URIs accepts valid redirect URIs normalizations normalizes redirect URIs to single spaces trims leading and trailing whitespace #destroy destroys associated access tokens OAuth2::Provider::AccessToken belongs to an account belongs to a client .find_by_token? returns the access token when found returns nil when not found #valid? when token has not expired returns true when token has expired returns false #has_mcp_scope? when scope includes 'mcp' returns true when scope only contains 'mcp' returns true when scope does not include 'mcp' returns false when scope is empty returns false given a string with 'mcp' as a substring returns false LastTime validations rejects blank name rejects duplicates rejects non-existent account accepts nil account_id successfully validates instance FilterTerm instantiates the class Tag #after_create when called 10 times calls `full_recount` once calls `update_count` 9 times #after_destroy when called 10 times calls `full_recount` once calls `update_count` 9 times #save increments the count #destroy decrements the count .match returns the best match returns no match with SQL wildcard character in prefix treats underscore as literal character treats percent as literal character full recount logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match update count logic an object isn't published returns the match an object is deleted returns the match an object is blocked returns the match an actor is deleted returns the match an actor is blocked returns the match validations rejects if subject_iri is blank rejects if subject_iri is not an absolute URI successfully validates instance Prompt .all loads prompts loads new prompts caches prompts handles no prompts .find raises error for missing prompt finds prompt by name finds newly created prompts .find? returns nil for missing prompt finds prompt by name finds newly created prompts .substitute raises error for missing variables substitutes variables from arguments and context allows arguments to override context variables handles escaped braces permits escaped closing braces .from_yaml and #to_yaml can deserialize and serialize a prompt Relationship validations runs validation and rejects runs validation and rejects rejects duplicates successfully validates instance Task::Fetch::Fetcher #complete! makes the task not runnable makes the class interrupted #find_or_fetch_object given an object fetches the object persists the object fetches the actor persists the actor returns the object returns true that can't be dereferenced fetches the object does not persist the object does not return the object returns false given a prior failure does not fetch the object fetches the actor does not persist the actor does not return the object returns false given a prior failure does not fetch the actor that is already cached does not fetch the object does not persist the object does not fetch the actor does not persist the actor returns the object returns false that is deleted does not return the object returns false returns the object returns false that is blocked does not return the object returns false returns the object returns false from a deleted actor does not return the object returns false returns the object returns true from a blocked actor does not return the object returns false returns the object returns true when the server is shutting down raises an exception #set_next_attempt_at sets the next attempt at in the immediate future does not increment the failure counter sets the next attempt at in the near future does not increment the failure counter sets the next attempt at in the far future increments the failure counter sets the next attempt at in the near future does not increment the failure counter given a prior failure resets the failure counter resets the failure counter returns a time even further in the future increments the failure counter given six prior failures returns a time the maximum distance in the future increments the failure counter when the task is not followed sets the next attempt at in the immediate future does not set the next attempt at does not set the next attempt at when the task has been interrupted does not set the next attempt at does not set the next attempt at does not set the next attempt at Task::Fetch::Thread validation rejects missing source rejects blank thread successfully validates instance #thread= sets subject_iri #thread gets subject_iri .find_or_new given an existing task for thread finds the existing task finds the existing task finds the existing task finds the existing task #follow? returns false given a follow relationship returns true #perform sets the next attempt at given a thread with no replies changes time of last attempt does not change time of last success given a thread with one reply does not fetch the replies collection changes time of last attempt changes time of last success fetches the replies collection changes time of last attempt changes time of last success given a thread with a local reply starts with cached objects in the horizon fetches all the uncached objects persists all the uncached objects does not fetch the local object replies collection fetches the remote object replies collection changes time of last attempt does not change time of last success and a later reply adds the later reply to the horizon changes time of last attempt changes time of last success given a thread with many replies starts with cached objects in the horizon fetches the object fetches the collection fetches a reply from the collection persists a reply from the collection does not change the thread value adds a reply to the horizon sets the next attempt in the immediate future fetches the object fetches the collection once fetches all the replies from the collection persists all the replies from the collection does not change the thread value adds all the replies to the horizon sets the next attempt in the near future with all replies already fetched sets the next attempt in the far future and a later reply does not fetch the later reply does not add the later reply to the horizon sets the next attempt in the far future fetches the later reply adds the later reply to the horizon sets the next attempt in the far future with some replies fetched does not fetch the object does not fetch the collection fetches the remaining replies from the collection persists the remaining replies from the collection and the task is asynchronously set as complete does not fetch the object does not fetch the collection does not fetch any replies from the collection does not set the next attempt at sets the task as complete given a thread with uncached ancestors starts with cached objects in the horizon fetches the nearest uncached object persists the nearest uncached object adds the nearest uncached object to the horizon updates the thread value does not set the root object sets the next attempt in the immediate future fetches all the uncached objects persists all the uncached objects adds all the uncached objects to the horizon updates the thread value sets the root object sets the next attempt in the near future and uncached authors fetches all the uncached authors persists all the uncached authors with a cached ancestor does not fetch the object fetches the other objects that is deleted does not fetch the object still fetches the other objects that is blocked does not fetch the object still fetches the other objects with a cached root adds the root to the horizon with replies fetches the replies with an unfetchable object fetches the object does not fetch following objects fetches preceding objects with all replies fetched sets the next attempt in the far future given a thread with pages of replies organized by first and next fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future organized by last and prev fetches the collections fetches the replies from the collections persists the replies adds the replies to the horizon sets the next attempt in the near future given a thread with Mastodon-style paging starts with cached objects in the horizon fetches the collections fetches the replies from the collections persists the replies from the collections adds the replies from the collections to the horizon does not update the thread value sets the next attempt in the near future with all replies fetched sets the next attempt in the far future .merge_into updates task if thread changes given an existing task for thread merges the tasks destroys the task which is merged from does not destroy the task which is merged to #best_root returns the object when the root it cached returns the root #path_to returns the path to the thread page Task::Fetch::Thread::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil ActivityPub::Object given a task updates fetch tasks when thread changes given an existing fetch task updates fetch tasks when thread changes Task::Fetch::Hashtag validation rejects missing source rejects blank name successfully validates instance #follow? returns false given a follow relationship returns true #perform sets the next attempt at given no tagged object has an empty horizon given one tagged object starts with the collection in the horizon fetches the hashtag collection changes time of last attempt does not change time of last success starts with the href of the hashtag in the horizon does not fetch the hashtag collection changes time of last attempt does not change time of last success given many tagged objects fetches the hashtag collection fetches an object from the collection persists an object from the collection changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection once fetches all the objects from the collection persists all the objects from the collection changes time of last attempt changes time of last success sets the next attempt in the near future with all objects already fetched sets the next attempt in the far future and a later object does not fetch the object sets the next attempt in the far future does not fetch the object sets the next attempt in the far future and later objects adds the new collection to the horizon fetches the new collection fetches the uncached object from the collection persists the uncached object from the collection sets the next attempt in the near future with all objects fetched does not fetch any new objects sets the next attempt in the near future with some objects fetched does not fetch the collection fetches the remaining objects from the collection persists the remaining objects from the collection and uncached authors fetches all the uncached authors persists all the uncached authors and the task is asynchronously set as complete does not fetch the hashtag collection does not fetch any objects from the collection does not set the next attempt at sets the task as complete given many tagged objects, all in multiple collections fetches the remaining object once with a blocked author fetches the remaining object once given many tagged objects, via the Mastodon API fetches the hashtag collection fetches the API response fetches an object from the API persists an object from the API changes time of last attempt changes time of last success sets the next attempt in the immediate future fetches the hashtag collection fetches the API response fetches all the objects from the API persists all the objects from the API changes time of last attempt changes time of last success sets the next attempt in the near future does not raise an error does not raise an error given tagged objects from more than one origin starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once given tagged objects from more than one origin, via the Mastodon API starts with the initial collection in the horizon changes time of last attempt changes time of last success and the second object fetched adds the second collection to the horizon does not add the collection for the unrelated hashtag to the horizon and the third object fetched adds the third collection to the horizon and a undereferenceable object IRI only tries to fetch it once #path_to returns the path to the hashtag page Task::Fetch::Hashtag::State::Node creation normalizes and downcases the href Task::Fetch::Hashtag::State #<< returns the state instance appends the node #includes? returns true if nodes includes node returns false if nodes does not include node #prioritize! sorts nodes by difference between last success and last attempt #last_success_at returns the time of the most recent successful fetch when nodes have never succeeded returns nil Task::RunScripts .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at cleans up its session if there is no account yet does not raise an error sets the next attempt at Task::CleanOauth #cleanup_expired_tokens when expired tokens exist deletes expired access tokens #cleanup_orphaned_clients with a client that has never been accessed deletes the client that has never been accessed when client was manually created does not delete the manual client with a client that was accessed more than one year ago deletes the client that has not been accessed recently when client was manually created does not delete the manual client Task::Singleton .find_active returns nil when no tasks exist when a runnable task exists returns the task when a running task exists returns the task when a complete task exists returns nil when a failed task exists returns nil when multiple active tasks exist returns the most recent task .current_instance returns a SingletonTask instance creates a new instance when none exists when a running task exists does not create a new instance returns the running task when a runnable task exists does not create a new instance returns the existing runnable task when only non-runnable tasks exist creates a new runnable instance returns a runnable task when multiple runnable tasks exist returns the most recent task .ensure_scheduled schedules the task creates a new instance when none exists when a running task exists does not raise an error does not create a new task returns the existing running task as current_instance when called multiple times is idempotent Task::Transfer #sanitize_log_message returns short messages without newlines unchanged replaces newline with literal '\n' replaces CRLF with literal '\n' truncates messages longer than 200 characters respects `max_length` parameter #transfer dereferences the recipient does not dereference the transferer sends the activity to the local recipient sends the activity to the remote recipient does not send the activity to the transferer given an OpenSSL error doesn't raise an error stores the failure reason does not mark the recipient as down given an IO error doesn't raise an error stores the failure reason does not mark the recipient as down given three errors for the same recipient within the last ten days marks the recipient as down given only two errors for the same recipient does not mark the recipient as down when the recipient is down does not send the activity to the recipient when recipient has a shared inbox sends the activity to the shared inbox given another remote recipient when multiple recipients share the same shared inbox delivers once to the shared inbox when delivery to the shared inbox fails tracks failures for each recipient when mixing recipients with and without a shared inbox delivers to shared and individual inboxes appropriately .is_recipient_down? with no tasks returns false with fewer than 3 failures returns false with 3+ failures spanning less than 80 hours returns false with 3+ failures spanning 80+ hours without intermediate success returns true with 3+ failures spanning 80+ hours with intermediate success returns false with 3+ failures spanning 80+ hours with recent success returns false with 3+ failures spanning 80+ hours with intermediate success returns false with failures for multiple recipients returns true Task::Deliver validation rejects missing sender rejects missing activity successfully validates instance #recipients includes the sender by default addressed to a local recipient includes the recipient addressed to a remote recipient that is cached includes the recipient that is not cached includes the recipient addressed to a local collection does not include the collection of the sender's followers does not include the collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients addressed to a remote collection does not include the collection addressed to the public collection does not include the collection #perform when the object has been deleted does not fail Task::Terminate validation rejects missing source rejects missing subject rejects remote subject successfully validates instance #perform when an object exists deletes the object when the object is published creates a delete activity for the object schedules a task to deliver the activity reschedules itself when no objects exist deletes the actor creates a delete activity for the actor schedules a task to deliver the activity does not reschedule itself Task::UpdateMetrics #last_id retrieves the last id value from the state #last_id= stores the last id value in the state .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at given items in the inbox creates points accumulates points for activities on the same day accumulates points in the timezone of the account creates points for activities created since the last run point already exists increments point value when account has been terminated does not raise an error does not create points for orphaned relationships does not set the last_id sets the last_id Task::CollectGarbage .ensure_scheduled schedules a new task given an existing task does not schedule a new task .objects_attributed_to_user is empty given object attributed to user returns the object given object attributed to non-existent user does not return the object given object attributed to no one does not return the object .objects_attributed_to_followed_actors is empty given object attributed to remote actor does not return the object and a follow returns the object .objects_associated_with_user_activities is empty given activity by local actor returns the object given activity by remote actor does not return the object given activity by local actor returns the object given activity by remote actor does not return the object .objects_associated_with_followed_actor_activities is empty given activity by remote actor does not return the object and a follow returns the object does not return the object and a follow returns the object .objects_associated_with_followed_content is empty given object with hashtag does not return the object and user follows hashtag returns the object given object with mention does not return the object and user follows mention returns the object given object in thread does not return the object and user follows thread returns the object .objects_in_user_relationships is empty given object in timeline relationship returns the object given object in notification relationship returns the object returns the object given activity in inbox relationship (object) does not return the object given activity in outbox relationship (object) returns the object given activity in inbox relationship (target) does not return the object given activity in outbox relationship (target) returns the object given activity in notification relationship (object) returns the object given activity in notification relationship (target) returns the object given object with multiple relationship types returns the object once (deduplicated) given activity with object and target in relationships returns both the object and target .objects_too_recent_to_delete returns recent objects .objects_in_threads is empty given a thread does not return any objects given object attributed to user returns all objects but thread is legacy returns all objects given object associated with user activity (object) returns all objects given object associated with user activity (target) returns all objects given object associated with remote actor activity (object) does not return any objects and a follow returns all objects given object associated with remote actor activity (target) does not return any objects and a follow returns all objects given object attributed remote actor does not return any objects and a follow returns all objects given object has hashtag does not return any objects and a hashtag follow returns all objects given object has mention does not return any objects and a mention follow returns all objects given thread is followed returns all objects given object in timeline relationship returns all objects given activity in notification relationship (object) returns all objects given activity in notification relationship (target) returns all objects when object is recent returns all objects #perform sets the next attempt at does not destroy the object when the object is too old destroys the object given object attributed to user preserves object given object associated with user activity (object) preserves the object given object associated with user activity (target) preserves the object given object associated with remote actor activity (object) destroys the object and a follow preserves the object given object associated with remote actor activity (target) destroys the object and a follow preserves the object given object attributed remote actor destroys the object and a follow preserves the object given object has hashtag destroys the object and a hashtag follow preserves the object given object has mention destroys the object and a mention follow preserves the object given a thread destroys the object and a thread follow preserves the object destroys the thread and one object is recent preserves entire thread given object in timeline relationship preserves the object given activity in notification relationship (object) preserves the object given activity in notification relationship (target) preserves the object given more objects than the max delete count deletes only up to the maximum count #delete_object_and_associations deletes the object given object has hashtag deletes associated hashtag given object has mention deletes associated mention given associated activities deletes associated activities and undo activity deletes undo activity given relationships deletes timeline relationship deletes relationships given a thread deletes the object but not the replies given translation deletes translation returns the number of objects deleted complex scenario deletes all related entities in a single operation Task::Receive validation rejects missing receiver rejects missing activity successfully validates instance #deliver_to retrieves the deliver to value from the state retrieves the deliver to value from the state #deliver_to= stores the deliver to value in the state #recipients does not include the receiver by default addressed to the receiver includes the receiver addressed to a local recipient does not include the recipient addressed to a remote recipient does not include the recipient addressed to a local collection does not include the collection of the receiver's followers given a reply does not include the collection does not include the followers which is addressed to the local collection includes the followers when follows are not confirmed does not include the followers when followers have been deleted does not include the recipients when the original is not attributed to the receiver does not include the followers but it is itself a reply to another post by the receiver includes the followers unless it doesn't address the local colletion does not include the followers addressed to a remote collection does not include the collection does not include the receiver of the senders's followers includes the receiver when collection isn't the followers collection does not include the receiver when follows are not confirmed does not include the receiver addressed to the public collection does not include the collection does not include the receiver the receiver is a follower of the sender includes the receiver #perform when the object has already been deleted does not fail Task::Monitor #running_tasks_without_fibers returns an empty array given a running concurrent task returns the task given a fiber does not return the task #perform sets the next attempt at Task::Backup .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at #perform_backup dumps a backup file Task::HandleFollowRequest #perform does not create an Accept activity does not create a Follow activity when the account has auto_approve_followers enabled creates and processes Accept activity schedules delivery of Accept activity given an existing follow relationship confirms the follow relationship when the account has auto_follow_back enabled creates and processes Follow activity schedules delivery of Follow activity given an existing follow relationship does not create a Follow activity given an existing follow activity does not create a Follow activity with activity is missing completes gracefully without error does not create an Accept activity does not create a Follow activity when account is missing completes gracefully without error does not create an Accept activity does not create a Follow activity Task::RefreshActor validation rejects missing source rejects missing actor rejects local actor when task already exists for that actor rejects task rejects task if existing task is running successfully validates task if existing task is complete successfully validates task if existing task has a backtrace successfully validates task .exists? returns true if existing task is scheduled returns true if existing task is running returns false if existing task is complete returns false if existing task has a backtrace #perform fetches the actor updates the actor given a subscription 2025-11-13T23:57:07.814736Z INFO - Ktistec is going to take a rest! 2025-11-13T23:57:10.498392Z NOTICE - database: Slow query [ 72.277ms] -- INSERT OR REPLACE INTO actors ("id","blocked_at","created_at","updated_at","deleted_at","type","iri","username","pem_public_key","pem_private_key","shared_inbox","inbox","outbox","following","followers","name","summary","icon","image","urls","attachments","down_at") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) -- args: [nil, nil, 2016-02-15 12:08:10.0 UTC, 2025-11-13 23:57:10.325368777 UTC, nil, "ActivityPub::Actor", "https://remote/actors/jfoghbea", nil, nil, nil, nil, "https://remote/actors/jfoghbea/inbox", nil, "https://remote/actors/jfoghbea/following", "https://remote/actors/jfoghbea/followers", nil, nil, nil, nil, nil, nil, nil] 2025-11-13T23:57:10.498567Z NOTICE - database: [] 2025-11-13T23:57:16.533812Z INFO - Ktistec is going to take a rest! 2025-11-13T23:57:44.490442Z NOTICE - database: Slow query [ 80.153ms] -- SELECT "id","created_at","updated_at","iri","items_iris","total_items","first_iri","last_iri","prev_iri","next_iri","current_iri" FROM "collections" WHERE "iri" = ? -- args: [nil] 2025-11-13T23:57:44.490647Z NOTICE - database: [{0, "SEARCH collections USING INDEX idx_collections_iri (iri=?)"}] 2025-11-13T23:57:54.523414Z INFO - task.clean_oauth: Deleted 1 expired access tokens 2025-11-13T23:57:54.548100Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:57:54.571329Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:57:54.594808Z INFO - task.clean_oauth: Deleted 1 inactive clients 2025-11-13T23:57:54.619014Z INFO - task.clean_oauth: Deleted 0 inactive clients 2025-11-13T23:57:56.028571Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/yliurwpj published=false 2025-11-13T23:57:56.030618Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/gsepzjcl published=true 2025-11-13T23:57:56.033468Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/itvbzxgo published=true 2025-11-13T23:57:56.035751Z WARN - task.terminate: Task::Terminate: deleting https://test.test/objects/teuaylfm published=false 2025-11-13T23:57:56.036634Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/vwulamcs 2025-11-13T23:57:56.038838Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/gmceltzi 2025-11-13T23:57:56.040905Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/tyqfdxcu 2025-11-13T23:57:56.043103Z WARN - task.terminate: Task::Terminate: deleting https://test.test/actors/eikvjwlc 2025-11-13T23:57:57.071986Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/rwtdyafl 2025-11-13T23:57:57.099538Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/wzbagluy 2025-11-13T23:57:57.128044Z INFO - task.update_metrics: Skipping relationship for terminated account: https://test.test/actors/rlnbjuhm 2025-11-13T23:57:57.159500Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:57.167063Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:57.167074Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:57.167079Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:57.168035Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:57.168040Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:57.169713Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:57.175006Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:57.175016Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:57.175021Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:57.175574Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:57.175577Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:57.176135Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:57.179391Z INFO - task.collect_garbage: Object identification completed in 0.0 seconds 2025-11-13T23:57:57.179402Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.239450Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.244927Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.244938Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.246655Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.251996Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.252007Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.254147Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.259417Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.259427Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.259438Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.260040Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.260044Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.286818Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.292156Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.292166Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.319591Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.325196Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.325207Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.350601Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.356206Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.356216Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.358767Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.364355Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.364367Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.364372Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.365038Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.365044Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.392417Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.397990Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.398002Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.400585Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.406077Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.406088Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.406099Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.406770Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.406774Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.435531Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.441093Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.441104Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.443529Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.448849Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.448859Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.448864Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.449486Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.449490Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.475123Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.480591Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.480602Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.482956Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.488437Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.488447Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.488451Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.489060Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.489064Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.516893Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.522462Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.522472Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.524883Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.530353Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.530364Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.530369Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.531008Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.531012Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.559885Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.565438Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.565450Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.567873Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.573220Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.573231Z INFO - task.collect_garbage: Found 1 objects to delete 2025-11-13T23:57:58.573236Z INFO - task.collect_garbage: Processing batch 1 (1 objects) 2025-11-13T23:57:58.573827Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.573831Z INFO - task.collect_garbage: Garbage collection completed: deleted 1 objects 2025-11-13T23:57:58.604354Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.609702Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.609712Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.613528Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.618846Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.618857Z INFO - task.collect_garbage: Found 3 objects to delete 2025-11-13T23:57:58.618862Z INFO - task.collect_garbage: Processing batch 1 (3 objects) 2025-11-13T23:57:58.620620Z INFO - task.collect_garbage: Batch 1 completed in 0.0 seconds 2025-11-13T23:57:58.620628Z INFO - task.collect_garbage: Garbage collection completed: deleted 3 objects 2025-11-13T23:57:58.625171Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.630780Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.630792Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.657927Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.663276Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.663287Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.691920Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.697581Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.697593Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:58.723548Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:58.729390Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:58.729400Z INFO - task.collect_garbage: Garbage collection completed: deleted 0 objects 2025-11-13T23:57:59.453306Z INFO - task.collect_garbage: Starting garbage collection of objects older than 365 days (maximum 1000 objects) 2025-11-13T23:57:59.461094Z INFO - task.collect_garbage: Object identification completed in 0.01 seconds 2025-11-13T23:57:59.461106Z INFO - task.collect_garbage: Found 1000 objects to delete 2025-11-13T23:57:59.461121Z INFO - task.collect_garbage: Processing batch 1 (100 objects) 2025-11-13T23:57:59.510532Z INFO - task.collect_garbage: Batch 1 completed in 0.05 seconds 2025-11-13T23:57:59.510549Z INFO - task.collect_garbage: Processing batch 2 (100 objects) 2025-11-13T23:57:59.559307Z INFO - task.collect_garbage: Batch 2 completed in 0.05 seconds 2025-11-13T23:57:59.559329Z INFO - task.collect_garbage: Processing batch 3 (100 objects) 2025-11-13T23:57:59.606913Z INFO - task.collect_garbage: Batch 3 completed in 0.05 seconds 2025-11-13T23:57:59.606929Z INFO - task.collect_garbage: Processing batch 4 (100 objects) 2025-11-13T23:57:59.655241Z INFO - task.collect_garbage: Batch 4 completed in 0.05 seconds 2025-11-13T23:57:59.655262Z INFO - task.collect_garbage: Processing batch 5 (100 objects) 2025-11-13T23:57:59.703713Z INFO - task.collect_garbage: Batch 5 completed in 0.05 seconds 2025-11-13T23:57:59.703736Z INFO - task.collect_garbage: Processing batch 6 (100 objects) 2025-11-13T23:57:59.751839Z INFO - task.collect_garbage: Batch 6 completed in 0.05 seconds 2025-11-13T23:57:59.751855Z INFO - task.collect_garbage: Processing batch 7 (100 objects) 2025-11-13T23:57:59.800336Z INFO - task.collect_garbage: Batch 7 completed in 0.05 seconds 2025-11-13T23:57:59.800351Z INFO - task.collect_garbage: Processing batch 8 (100 objects) 2025-11-13T23:57:59.847703Z INFO - task.collect_garbage: Batch 8 completed in 0.05 seconds 2025-11-13T23:57:59.847725Z INFO - task.collect_garbage: Processing batch 9 (100 objects) 2025-11-13T23:57:59.895680Z INFO - task.collect_garbage: Batch 9 completed in 0.05 seconds 2025-11-13T23:57:59.895696Z INFO - task.collect_garbage: Processing batch 10 (100 objects) 2025-11-13T23:57:59.944005Z INFO - task.collect_garbage: Batch 10 completed in 0.05 seconds 2025-11-13T23:57:59.944017Z INFO - task.collect_garbage: Garbage collection completed: deleted 1000 objects 2025-11-13T23:58:00.872402Z INFO - Updating database statistics: 0.861ms notifies subscribers when refresh fails notifies subscribers when actor is marked as down marks the actor as up and refresh fails does not mark the actor as up when actor is marked as up and refresh fails marks the actor as down documents the error if fetch fails Task::Performance .ensure_scheduled schedules a new task given an existing task does not schedule a new task #perform sets the next attempt at records three data points Translation it instantiates the class Point .charts returns the names of all charts .chart returns the points in the chart returns the points before the ending of the range returns the points after the beginning of the range does not return points not in the chart Relationship::Content::Canonical validation rejects relative from_iri rejects relative to_iri given a route rejects a from_iri that routes rejects a to_iri that does not route given an exiting relationship rejects existing from_iri rejects existing to_iri successfully validates instance Relationship::Content::Timeline creation creates confirmed relationships by default validation rejects missing owner rejects missing object successfully validates instance Relationship::Content::Approved validation rejects missing actor rejects missing object successfully validates instance Relationship::Content::Outbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification::Follow::Mention validation rejects blank name successfully validates instance Relationship::Content::Notification::Follow::Hashtag validation rejects blank name successfully validates instance Relationship::Content::Inbox creation creates confirmed relationships by default validation rejects missing owner rejects missing activity permits duplicates successfully validates instance Relationship::Content::Notification creation creates confirmed relationships by default validation rejects missing owner successfully validates instance Relationship::Content::Follow::Thread validation rejects missing actor rejects blank thread successfully validates instance #thread= sets to_iri #thread gets to_iri .find_or_new given an existing relationship for thread finds the existing follow finds the existing follow finds the existing follow finds the existing follow .merge_into updates relationship if thread changes given an existing relationship for thread merges the relationships destroys the relationship which is merged from does not destroy the relationship which is merged to ActivityPub::Object given a follow updates follow relationships when thread changes given an existing follow relationship updates follow relationships when thread changes Relationship::Content::Follow::Mention validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Content::Follow::Hashtag validation rejects missing actor rejects blank name successfully validates instance #name= sets to_iri #name gets to_iri Relationship::Social::Follow validation rejects missing actor rejects missing actor successfully validates instance #activity? returns nil given an associated follow activity returns the associated follow activity that has been undone returns nil given multiple associated follow activities returns the most recent follow activity .followers_for with multiple followers returns followers for the given actor supports pagination .following_for with multiple following returns following for the given actor supports pagination .followers_since with followers created at different times returns count since timestamp returns total number returns zero .following_since with following created at different times returns count since timestamp returns total number returns zero #accepted? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns true when follow activity has been rejected returns false #rejected? when no follow activity exists returns false when follow activity exists but no accept/reject returns false when follow activity has been accepted returns false when follow activity has been rejected returns true #pending? when confirmed is false returns true when confirmed is true returns false Session #body= sets the body #body gets the body #string stores a string value in the session retrieves a string value from the session #string? retrieves a string value from the session returns nil #delete deletes the entry from the session with an expiry in the future stores the expiration date retrieves a string value from the session retrieves a string value from the session deletes the entry from the session with an expiry in the past stores the expiration date raises an exception returns nil returns nil #account= sets the account #account gets the account #generate_jwt generates a web token .find_by_jwt? returns the session returns nil returns nil .clean_up_stale_sessions given an old, anonymous session destroys the anonymous session givan an old, authenticated session destroys the old session ActivityPub::Object #source= assigns content assigns media type assigns attachments assigns hashtags creates hashtags assigns mentions creates mentions doesn't assign if the object isn't local addressing replaces mentions when object is public sets the to field sets the cc field when object is private sets the to field sets the cc field when object is direct sets the to field sets the cc field when validating returns false if the canonical path is not valid returns false if the language is not supported is valid given embedded objects gets the ids .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #from_json_ld updates an existing instance when addressed to the public collection is visible when hashtag name is null is ignored when hashtag name is blank is ignored when mention name is null is ignored when mention name is blank is ignored when attachment url is null is ignored when attachment url is blank is ignored when attachment media type is null is ignored when attachment media type is blank is ignored with focalPoint field deserializes focal point with focalPoint at center deserializes center focal point with malformed focalPoint handles malformed focal point gracefully when language is present sets the language when sensitive property is missing defaults sensitive to false #to_json_ld renders an identical instance with focal point includes toot context in output serializes focal point in attachment round-trips focal point correctly does not render a content map renders hashtags renders mentions renders sensitive property when true does not render sensitive property when false #make_delete_activity instantiates a delete activity for the subject assigns the subject's attributed_to as the actor assigns the subject as the object copies the subject's to copies the subject's cc .federated_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts paginates the results with a draft post filters out draft posts .federated_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts with a draft post filters out draft posts .public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities paginates the results .public_posts_count instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out objects belonging to undone activities returns the count .latest_public_post returns -1 if there are no posts given posts returns the id ignores activities from remote actors ignores activities that are undone ignores activities that are not create or announce #with_statistics! updates announces count updates likes count updates dislikes count doesn't fail when the object hasn't been saved filters out undone announces filters out undone likes filters out undone dislikes #thread sets thread to its iri given a reply and a thread on object sets thread to object's thread and an in_reply_to_iri on object sets thread to object's in_reply_to_iri and an in_reply_to_iri on reply sets thread to its in_reply_to_iri sets thread to object's iri when saving the root in a thread sets reply's thread to object's thread #thread! updates the thread saves the updated object returns the thread when threaded #with_replies_count! returns the count of replies omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors given an actor doesn't count any replies and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies #replies returns replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits unapproved replies and an approved object returns approved replies omits deleted replies omits blocked replies omits destroyed replies omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors omits non-visible replies even when approved #thread returns all replies properly nested omits destroyed replies and their children omits replies with destroyed attributed to actors returns the depths when the root is missing returns the thread given a reply by the original poster prioritizes the reply given an approval only includes the subject and an approved object omits unapproved replies but includes their approved children doesn't include the actor's unapproved replies doesn't include non-visible replies even when approved #thread_query returns projection fields returns the same objects in the same order as `thread` omits destroyed replies and their children omits replies with destroyed attributed to actors includes deleted status for non-deleted objects given a deleted object includes deleted status for deleted objects includes blocked status for non-blocked objects given a blocked object includes blocked status for blocked objects returns nil for hashtags given hashtags includes hashtags returns nil for mentions given mentions includes mentions #ancestors returns all ancestors omits deleted replies and their parents omits blocked replies and their parents omits destroyed replies and their parents omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #descendants returns all descendants omits deleted replies and their children omits blocked replies and their children omits destroyed replies and their children omits replies with deleted attributed to actors omits replies with blocked attributed to actors omits replies with destroyed attributed to actors returns the depths #analyze_thread with small test thread includes basic statistics includes thread_id includes root_object_id includes key_participants includes notable_branches includes timeline_histogram #activities returns the associated activities given a like includes only activities of the specified class excludes all activities of the specified class filters out undone activities filters out activities of deleted actors filters out activities of blocked actors #approved_by? returns true if approved by actor returns false if not approved by actor #external? returns true #root? returns true if root returns false if a reply returns false if not root #draft? returns true if draft returns false if not local returns false if published canonical path #canonical_path returns nil by default given an existing canonical relationship returns the canonical path given an existing canonical relationship #save doesn't destroy the canonical path #canonical_path= assigns a new canonical path adds the canonical path to urls given an existing canonical relationship updates the canonical path adds the canonical path to urls removes the canonical path removes the canonical path from urls given existing urls adds the canonical URL to the urls #delete destroys the associated canonical path #destroy destroys the associated canonical path #tags returns tags #preview returns nil with content returns content and content translation returns content translation and summary returns summary and summary translation returns summary translation with multiple translations uses most recent translation with blank values ignores blank values ActivityPub::Object::ModelHelper .from_json_ld populates replies_iri does not populate replies given a replies collection with the same host populates replies given object without an id does not populate replies given replies with a different host does not populate replies given replies without an id populates replies ActivityPub::Object::Attachment #has_focal_point? returns false for missing focal point returns true for valid position returns true for valid positions #normalized_focal_point converts Mastodon coordinates #css_object_position generates correct CSS values returns center fallback when no focal point ActivityPub::Activity when validating is valid .from_json_ld instantiates the subclass creates a new instance when addressed to the public collection is visible #from_json_ld updates an existing instance when addressed to the public collection is visible #to_json_ld renders an identical instance renders object and target recursively by default renders everything recursively if true renders nothing recursively if false ActivityPub::Activity::ModelHelper .from_json_ld populates actor_iri does not populate actor given an actor with the same host populates actor populates object_iri does not populate object given an object with the same host populates object populates target_iri does not populate target given a target with the same host populates target Ktistec::Model::Blockable .new includes Ktistec::Model::Blockable #block! blocks the instance sets blocked_at #unblock! unblocks the instance clears blocked_at Ktistec::Model::Linked .new includes Ktistec::Model::Linked validation may be absent must be present must be an absolute URI must be unique is valid the generated accessor does not fetch and does not return the object fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object returns but does not fetch the object when linked object is remote does not fetch and does not return the object fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object returns but does not fetch the object fetches and returns the object when linked object is cached and unchanged returns but does not fetch the object fetches and returns the object when linked object is changed returns but does not fetch the object fetches and returns the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error .dereference? fetches but does not return the object fetches but does not return the object when linked object is local returns but does not fetch the object returns but does not fetch the object when object is deleted does not return and does not fetch the object returns but does not fetch the object when linked object is remote fetches and returns the object fetches and returns the object when object is cached returns but does not fetch the object fetches and returns the object when object is deleted fetches and returns the object returns but does not fetch the object given bad JSON does not raise an error given bad JSON-LD does not raise an error given a bad JSON-LD value does not raise an error given an unsupported type does not raise an error #origin returns the origin #uid returns the unique identifier #local? indicates if the instance is local #cached? indicates if the instance is cached ActivityPub::Collection when validating must be an absolute URI must be unique is valid .from_json_ld creates a new instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #from_json_ld updates an existing instance extracts items identifiers extracts items identifiers handles ordered items handles embedded first handles embedded last handles embedded prev handles embedded next handles embedded current raises an error #to_json_ld renders an identical instance embeds first embeds last embeds prev embeds next embeds current embeds local item links remote item links item links item #all_item_iris returns nil given a collection with items returns the items given a collection paginated with first and next fetches the collections returns the items given a collection paginated with last and prev fetches the collections returns the items ActivityPub::Collection::ModelHelper .from_json_ld first tests populates first_iri does not populate first given first with the same host populates first given collection without an id does not populate first given first with a different host does not populate first given first without an id populates first last tests populates last_iri does not populate last given last with the same host populates last given collection without an id does not populate last given last with a different host does not populate last given last without an id populates last prev tests populates prev_iri does not populate prev given prev with the same host populates prev given collection without an id does not populate prev given prev with a different host does not populate prev given prev without an id populates prev next tests populates next_iri does not populate next given next with the same host populates next given collection without an id does not populate next given next with a different host does not populate next given next without an id populates next current tests populates current_iri does not populate current given current with the same host populates current given collection without an id does not populate current given current with a different host does not populate current given current without an id populates current items tests populates items_iris populates items given collection without an id populates items_iris populates items ActivityPub::Actor #username= assigns iri assigns inbox assigns outbox assigns following assigns followers assigns urls doesn't assign if the actor isn't local .match? returns the matched actor returns nil on failed match given empty urls matches on the iri given nil urls matches on the iri .search_by_username returns actors matching the prefix returns results ordered alphabetically respects the limit parameter returns empty array when no matches found excludes deleted actors excludes blocked actors with SQL wildcard character in username treats underscore as literal character treats percent as literal character #public_key returns the public key #private_key returns the private key when using the keypair verifies the signed message when validating is valid .map given an array of icons with width and height picks the largest icon given an array of icons picks the first icon given an array of images picks the first image .from_json_ld instantiates the subclass creates a new instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` parses the `sharedInbox` from `endpoint`s #from_json_ld updates an existing instance includes the public key given an array of URLs parses the array of URLs given `sharedInbox` updates `shared_inbox` #to_json_ld renders an identical instance renders the URL given an array of URLs renders the array of URLs given a shared inbox renders `sharedInbox` given an array of attachments renders the array of attachments, with html links does not render manuallyApprovesFollowers given a local actor with an account when auto_approve_followers is true renders manuallyApprovesFollowers as false when auto_approve_followers is false renders manuallyApprovesFollowers as true #make_delete_activity instantiates a delete activity for the subject assigns the subject as the actor assigns the subject as the object addresses (to) the public collection addresses (cc) the subject's followers and following #down? indicates that the actor is down indicates that the actor is not down #up? indicates that the actor is not up indicates that the actor is up #follow adds a public following relationship adds a public followers relationship adds a non-public following relationship adds a non-public followers relationship does not display a deleted following actor does not display a blocked following actor does not display a deleted followers actor #follows? filters response based on confirmed state filters response based on visible state returns falsey for deleted actors returns falsey for blocked actors #likes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the like has been undone paginates the results #dislikes instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the dislike has been undone paginates the results #announces instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts if the announce has been undone paginates the results #drafts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out published posts includes only posts attributed to subject paginates the results for outbox #in_outbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_outbox? returns true if object is in outbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in outbox for inbox #in_inbox instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities includes replies paginates the results #in_inbox? returns true if object is in inbox returns false if object has been deleted returns false if object has been blocked returns false if actor of activity has been deleted returns false if actor of activity has been blocked returns false if activity has been undone returns false if object is not in inbox #find_activity_for instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out undone activities filters for specific activities filters out specific activities returns the first activity #known_posts instantiates the correct subclass filters out non-public posts filters out deleted posts filters out blocked posts paginates the results #public_posts instantiates the correct subclass filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out non-public posts filters out replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #all_posts instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors includes non-public posts includes replies filters out posts belonging to undone activities filters out posts that are not in an outbox paginates the results #timeline instantiates the correct subclass returns the count filters out deleted posts filters out blocked posts filters out posts by deleted actors filters out posts by blocked actors filters out posts not associated with included activities filters out posts not associated with included activities given a prior create not in timeline includes announces by default includes announces filters out announces given a reply includes replies by default includes replies filters out replies given a local post includes the post given a post without an associated activity includes the post paginates the results #notifications instantiates the correct subclass returns the count filters out undone activities filters out activities with deleted objects filters out activities with blocked objects filters out activities from deleted actors filters out activities from blocked actors paginates the results approvals #approve approves the object #unapprove unapproves the object terms #terms instantiates the correct subclass paginates the results #handle returns the handle returns '[blocked]' when actor is blocked #display_name returns name when available returns username when name is blank returns iri when name and username are blank returns '[blocked]' when actor is blocked ActivityPub::Activity::Delete #actor returns an actor or actor subclass #object returns an actor, object or one of their subclasses validations when the object is an object fails if the actor is not the object's creator passes validation if the object has been deleted passes validation when the object is an actor fails if the actors do not match passes validation if the object has been deleted passes validation #to_json_ld doesn't recursively serialize the actor doesn't recursively serialize the object ActivityPub::Activity::Like #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Create #actor returns an actor or actor subclass #object returns an object or object subclass validations validates the actor is local validates the object is attributed to the actor passes validation ActivityPub::Activity::Undo #actor returns an actor or actor subclass #object returns a activity or activity subclass validations validates the actor is the object's actor passes validation ActivityPub::Activity::Accept #actor returns an actor or actor subclass #object returns a follow or follow subclass ActivityPub::Activity::Follow #actor returns an actor or actor subclass #object returns an actor or actor subclass #accepted_or_rejected returns nil when accepted returns the accept activity when rejected returns the reject activity state change scenarios when follow is first accepted then rejected should return the most recent reject activity when follow is first rejected then accepted should return the most recent accept activity when multiple accepts are received should return the most recent accept activity when multiple rejects are received should return the most recent reject activity validations validates the actor is local validates the object has an inbox passes validation ActivityPub::Activity::Dislike #actor returns an actor or actor subclass #object returns a object or object subclass ActivityPub::Activity::Reject #actor returns an actor or actor subclass #object returns a follow or follow subclass Task .ensure_scheduled does not reset next_attempt_at #gone? is false if the task is saved is true if the saved task is destroyed is true if the task is not saved #runnable? is true if running is false, complete is false and backtrace is nil is false if running is true is false if complete is true is false if backtrace is not nil #past_due? is true if next_attempt_at is nil is true if next_attempt_at is in the past is false if next_attempt_at is in the future #randomized_next_attempt_at returns exact time for deltas less than minimum threshold returns randomized time for delta equal to minimum threshold uses short adaptive percentage for intervals < 6 hours uses long adaptive percentage for intervals >= 6 hours uses explicit randomization percentage when provided #schedule raises an error if the task is running raises an error if the task has a backtrace sets the next_attempt_at if specified saves the task .scheduled returns the scheduled tasks in priority order does not reserve the scheduled tasks returns the scheduled tasks in priority order reserves the scheduled tasks given a saved task .destroy_old_tasks destroys old complete tasks destroys old failed tasks ignores recent tasks .clean_up_running_tasks sets running tasks to not running Task::ConcurrentTask #fiber_name returns the name of the associated fiber #fiber returns nil given a fiber returns the fiber Tag::Mention validation rejects missing subject rejects blank name #save strips the leading @ adds the host if missing does not change the host if present does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the mention does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects mentioned since given time returns count of objects mentioned since given time returns zero when no objects mentioned since given time returns zero for non-existent mention filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the mention returns zero Tag::Hashtag validation rejects missing subject rejects blank name #save strips the leading # does not change the count #destroy does not change the count .most_recent_object returns the most recent object with the tag does not return draft objects does not return deleted objects does not return blocked objects does not return objects with deleted attributed to actors does not return objects with blocked attributed to actors does not return objects with destroyed attributed to actors .all_objects returns objects with the tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors paginates the results .all_objects with since parameter returns count of objects tagged since given time returns count of objects tagged since given time returns zero when no objects tagged since given time returns zero for non-existent tag filters out draft objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors .all_objects_count returns count of objects with the tag returns zero .public_posts returns objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object paginates the results .public_posts_count returns count of objects with the tag filters out non-published objects filters out non-visible objects filters out deleted objects filters out blocked objects filters out objects with deleted attributed to actors filters out objects with blocked attributed to actors filters out objects with destroyed attributed to actors given a shared object includes the shared object ActivityPub .from_json_ld raises an error if the type is not specified defaults the instance to the specified class raises an error if the type is not supported defaults the instance to the specified class instantiates the correct subclass given aliases instantiates the base class creates an instance if one doesn't exist updates the instance if it already exists .from_json_ld? returns nil if the type is not specified returns nil if the type is not supported Account #password= changes the encrypted_password does not change the encrypted_password if the password is nil does not change the encrypted_password if the password is an empty string #encrypted_password returns the encrypted password #check_password returns true if supplied password is correct returns false if supplied password is not correct #validate rejects the username as too short rejects the username as containing invalid characters rejects the username as not unique rejects the password as too short rejects the password as weak rejects the language if blank rejects the language as unsupported rejects the timezone as unsupported given an actor to associate with #actor= updates the iri #actor updates the actor #save updates the associated actor's public key updates the associated actor's private key #sessions gets related sessions .monthly_active_accounts_count given an activity within the last 30 days returns a count of 1 that was undone returns a count of 0 given an activity older than 30 days returns a count of 0 ModelChannel #subscriptions returns the subscriptions #subscribe 2025-11-13T23:58:04.304104Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Unexpected char '<' at line 1, column 1 2025-11-13T23:58:04.339974Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:58:04.372173Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:58:04.407322Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel#linked_model? - https://remote/objects/object -- Not Implemented: no type 2025-11-13T23:58:04.708899Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Unexpected char '<' at line 1, column 1 2025-11-13T23:58:04.741366Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Expected Hash for #[]?(key : String), not Array(JSON::Any) 2025-11-13T23:58:04.778316Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Cast from Int64 to String failed, at /home/buildozer/aports/community/ktistec/src/crystal-1.16.3/src/json/any.cr:248:5 2025-11-13T23:58:04.816077Z INFO - ktistec.json_ld: SpectatorTestContext::Group__temp_28467::LinkedModel.dereference? - https://remote/objects/object - Not Implemented: FooBarBaz is invoked on timeout receives updates about the model #publish publishes an update but does not invoke any subscriptions given a subscription publishes an update given a different subscription does not publish an update given a block that raises an error removes the subscription given multiple updates merges the updates MCP::Prompts test_prompt validation validates and extracts arguments handles optional arguments validates required arguments with prompts/list request returns prompts test_prompt returns the definition whats_new returns the definition with prompts/get request returns protocol error for invalid prompt name MCP::Resources .handle_resources_list returns the information resource given two users returns both users .handle_resources_templates_list returns actor and object templates .handle_resources_read returns error for missing URI parameter returns error for unsupported schema returns information data for valid URI given a user returns user data for valid URI returns error for invalid user URI given an actor returns actor content and multiple actors in the URI returns multiple actor contents returns error for invalid actor URI given an object returns object content and multiple objects in the URI returns multiple object contents with HTML content returns HTML content with Markdown content returns HTML content with a translation uses translation content over original content with a like includes likes field in object JSON with a dislike includes dislikes field in object JSON with an announce includes announces field in object JSON with replies includes replies field in object JSON returns error for invalid object URI MCP::Tools test_tool validation validates and extracts arguments supplies default values for optional arguments invokes block validates missing arguments parameter validates required arguments validates string type validates string regex validates integer type validates integer maximum validates integer minimum validates boolean type validates time type validates time format parses valid time strings into Time objects test_array_tool validation accepts valid arrays handles default array values validates array type validates string array item types validates integer array item types validates boolean array item types validates minimum array size validates maximum array size validates unique items constraint with tools/list request returns test tools test_tool returns the definition test_array_tool returns the definition with tools/call request returns protocol error for invalid tool name with paginate_collection tool returns error for invalid collection name with a mention in the notifications returns notifications objects for valid request with a like returns liked status with a reply in the notifications returns reply notification for valid request with a reply returns replied status with an announce returns announced status with a follow in the notifications returns follow notification for valid request that is accepted returns accepted follow notification that is rejected returns rejected follow notification with a like in the notifications returns like notification for valid request with a dislike in the notifications returns dislike notification for valid request with an announce in the notifications returns announce notification for valid request with a new post to a followed hashtag in the notifications returns follow hashtag notification for valid request with a new post to a followed mention in the notifications returns follow mention notification for valid request with a new post to a followed thread in the notifications returns follow thread notification for valid request with an object in the timeline returns timeline objects for valid request with an object in actor's posts returns posts objects for valid request with a draft object for actor returns draft objects for valid request with page and/or size parameters returns 10 objects by default returns the 3rd page of objects returns specified number of objects when size is provided returns maximum number of objects when size equals limit works correctly with both page and size parameters with a hashtag collection returns hashtag objects for valid hashtag returns empty result for non-existent hashtag and a second object supports pagination for hashtag collections with a mention collection returns mention objects for valid mention returns empty result for non-existent mention and a second object supports pagination for mention collections with a liked object is empty and a like returns liked objects and another liked object supports pagination for likes collection with a disliked object is empty and a dislike returns disliked objects and another disliked object supports pagination for dislikes collection with an announced object is empty and an announce returns announced objects and another announced object supports pagination for announces collection for followers is empty given no followers with a follower returns follower relationships and an unconfirmed follower includes both confirmed and unconfirmed followers supports pagination for followers collection for following is empty given no following with following returns following relationships and an unconfirmed following includes both confirmed and unconfirmed following supports pagination for following collection with count_collection_since tool returns error for invalid collection name returns zero count for empty timeline with notifications returns count of notifications since given timestamp returns zero count when no notifications match timestamp returns total count when timestamp is before all notifications with objects in timeline returns count of objects since given timestamp returns zero count when no objects match timestamp returns total count when timestamp is before all objects with objects in actor's posts returns count of posts since given timestamp returns zero count when no posts match timestamp returns total count when timestamp is before all posts with draft objects for actor returns count of drafts since given timestamp returns zero count when no drafts match timestamp returns total count when timestamp is before all drafts with a hashtag collection returns count for valid hashtag returns 0 for non-existent hashtag with a mention collection returns count for valid mention returns 0 for non-existent mention with likes collection returns count for likes collection returns count for likes collection with announces collection returns count for announces collection returns count respecting since timestamp with followers collection returns zero count with followers returns count of followers returns zero count with following collection returns zero count with following returns count of following returns zero count with read_resources tool reads single actor resource reads single object resource reads information resource reads multiple different resource types and multiple actors reads batched resources and multiple objects reads batched resources handles invalid resource URI with get_thread tool retrieves thread with minimal projection retrieves thread with metadata projection defaults to metadata projection calculates summary statistics rejects invalid object_id rejects invalid projection name returns cursor when thread exceeds page size fetches subsequent pages using cursor returns nil cursor on last page raises error for invalid cursor rejects request with both object_id and cursor rejects request with neither object_id nor cursor with analyze_thread tool returns basic thread statistics returns timeline histogram identifies key participants identifies notable branches MCP::ResultsPager stores and retrieves first page retrieves subsequent pages returns nil cursor on last page returns empty page for empty results handles exact page size boundary raises error for invalid cursor format raises error for malformed cursor (not space-delimited) raises error for malformed cursor (non-numeric page number) raises error for non-existent pager_id raises error for invalid page number concurrent access maintains independent cursors #stats provides statistics with short TIME_TO_LIVE for testing 2025-11-13T23:58:09.080769Z WARN - mcp: unknown prompt: nonexistent_prompt 2025-11-13T23:58:10.420377Z WARN - mcp: unknown tool: nonexistent_tool expires old entries on store raises error when fetching expired cursor with low MAX_TOTAL_ENTRIES for testing evicts oldest when max_total_entries exceeded 2025-11-13T23:58:13.499629Z WARN - mcp: Removing pager f0aacd9e792f57e49e1310ac813ca4c5 (5 objects) never evicts the entry most recently added Ktistec::Handler::Canonical get /does/not/exist returns 404 returns 200 given a canonical mapping returns 200 returns 301 and a request for JSON does not redirect does not redirect and a request with a segment suffix returns 200 returns 301 and a HEAD request returns 200 returns 301 Failures: 1) Prompt.all loads new prompts Failure: new_prompt.name does not equal "new_prompt" actual: "test_prompt" expected: "new_prompt" # spec/models/prompt_spec.cr:60 Finished in 2:19 5072 examples, 1 failures Failed examples: crystal spec spec/models/prompt_spec.cr:48 # Prompt.all loads new prompts >>> ktistec: Entering fakeroot... created directory: '/home/buildozer/aports/community/ktistec/pkg/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/bin' 'server' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec/usr/bin/ktistec' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/' created directory: '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/ktistec' '/home/buildozer/aports/community/ktistec/pkg/ktistec/var/lib/ktistec/uploads' -> 'public/uploads' >>> ktistec-openrc*: Running split function openrc... 'etc/conf.d' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec-openrc/etc/conf.d' 'etc/init.d' -> '/home/buildozer/aports/community/ktistec/pkg/ktistec-openrc/etc/init.d' >>> ktistec-openrc*: Preparing subpackage ktistec-openrc... >>> ktistec-openrc*: Running postcheck for ktistec-openrc >>> ktistec*: Running postcheck for ktistec >>> ktistec*: Preparing package ktistec... >>> ktistec*: Stripping binaries >>> ktistec*: Script found. /bin/sh added as a dependency for ktistec-3.2.0-r0.apk >>> ktistec*: Adding .pre-install >>> ktistec*: Scanning shared objects >>> ktistec-openrc*: Tracing dependencies... >>> ktistec-openrc*: Package size: 926.0 B >>> ktistec-openrc*: Compressing data... >>> ktistec-openrc*: Create checksum... >>> ktistec-openrc*: Create ktistec-openrc-3.2.0-r0.apk >>> ktistec*: Tracing dependencies... tzdata /bin/sh so:libc.musl-x86_64.so.1 so:libcrypto.so.3 so:libgc.so.1 so:libgcc_s.so.1 so:libgmp.so.10 so:libpcre2-8.so.0 so:libsqlite3.so.0 so:libssl.so.3 so:libxml2.so.2 so:libyaml-0.so.2 so:libz.so.1 >>> ktistec*: Package size: 18.4 MB >>> ktistec*: Compressing data... >>> ktistec*: Create checksum... >>> ktistec*: Create ktistec-3.2.0-r0.apk >>> ktistec: Build complete at Thu, 13 Nov 2025 23:58:20 +0000 elapsed time 0h 48m 17s >>> ktistec: Cleaning up srcdir >>> ktistec: Cleaning up pkgdir >>> ktistec: Uninstalling dependencies... ( 1/30) Purging .makedepends-ktistec (20251113.231004) ( 2/30) Purging tzdata (2025b-r0) ( 3/30) Purging gc-dev (8.2.8-r1) ( 4/30) Purging libgc++ (8.2.8-r1) ( 5/30) Purging libxml2-dev (2.13.9-r0) ( 6/30) Purging libxml2-utils (2.13.9-r0) ( 7/30) Purging libxml2 (2.13.9-r0) ( 8/30) Purging sqlite-dev (3.51.0-r0) ( 9/30) Purging sqlite (3.51.0-r0) (10/30) Purging sqlite-libs (3.51.0-r0) (11/30) Purging yaml-dev (0.2.5-r2) (12/30) Purging yaml (0.2.5-r2) (13/30) Purging gc (8.2.8-r1) (14/30) Purging xz-dev (5.8.1-r0) (15/30) Purging xz (5.8.1-r0) (16/30) Purging xz-libs (5.8.1-r0) (17/30) Purging pcre2-dev (10.47-r0) (18/30) Purging zlib-dev (1.3.1-r2) (19/30) Purging libpcre2-16 (10.47-r0) (20/30) Purging libpcre2-32 (10.47-r0) (21/30) Purging libedit-dev (20251016.3.1-r0) (22/30) Purging bsd-compat-headers (0.7.2-r6) (23/30) Purging gmp-dev (6.3.0-r4) (24/30) Purging libgmpxx (6.3.0-r4) (25/30) Purging ncurses-dev (6.5_p20251010-r0) (26/30) Purging libncurses++ (6.5_p20251010-r0) (27/30) Purging libpanelw (6.5_p20251010-r0) (28/30) Purging libformw (6.5_p20251010-r0) (29/30) Purging libmenuw (6.5_p20251010-r0) (30/30) Purging openssl-dev (3.5.4-r0) busybox-1.37.0-r25.trigger: Executing script... OK: 440 MiB in 105 packages >>> ktistec: Updating the community/x86_64 repository index... >>> ktistec: Signing the index...