@evanp/activitypub-bot 0.41.3 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,1245 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on
6
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
+ and this project adheres to
8
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
+
10
+ ## [Unreleased]
11
+
12
+ ## [0.43.0] - 2026-04-22
13
+
14
+ ### Added
15
+
16
+ - Top-level exports for `LitePubRelayClientBot` and `LitePubRelayServerBot`
17
+ from `@evanp/activitypub-bot`.
18
+ - Back-compat aliases `RelayClientBot` and `RelayServerBot`, each re-exported
19
+ as the corresponding Mastodon relay class.
20
+ - README documentation for the `--allow-private`, `--redis-url`, and
21
+ `--trust-proxy` command-line options.
22
+ - README sections for `BotContext.duplicate()`, `updateNote()`, `deleteNote()`,
23
+ `getFollowersId()`, `isFollower()`, `isFollowing()`, `isPendingFollowing()`,
24
+ `followers()`, `following()`, `isLocal()`, and `onIdle()`.
25
+
26
+ ### Changed
27
+
28
+ - `.markdownlint.json` disables `MD013` inside code blocks so the CLI
29
+ help-output block can include longer option descriptions verbatim.
30
+ - README now documents `Bot.actorOK()` with its actual `actorId` parameter
31
+ name, and `BotContext.announceObject()` with its optional `actors` argument.
32
+ - `get botID ()` in the README was a typo for `get botId ()`; corrected.
33
+
34
+ ## [0.42.1] - 2026-04-22
35
+
36
+ ### Added
37
+
38
+ - `CHANGELOG.md` in [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
39
+ format.
40
+ - `CODE_OF_CONDUCT.md`.
41
+ - `.markdownlint.json` with `MD024` set to `siblings_only` to allow repeated
42
+ `### Added`/`### Fixed` subheadings per release.
43
+
44
+ ### Fixed
45
+
46
+ - Flaky `retries distribution to a flaky recipient` test waits on
47
+ `distributor.onIdle()` instead of a fixed 2-second timeout.
48
+
49
+ ## [0.42.0] - 2026-04-22
50
+
51
+ ### Added
52
+
53
+ - `LitePubRelayClientBot`, a functional LitePub relay client.
54
+ - `BotContext.followers()` and `BotContext.following()` async iterators.
55
+ - Additional `BotContext` introspection methods to support relay client bots.
56
+ - `actorType` getter on `Bot` so subclasses can override their declared
57
+ actor type.
58
+ - `relayForwarding` option on `LitePubRelayServerBot`.
59
+ - Dedicated `LitePubRelayServerBot` separate from the Mastodon-style server.
60
+
61
+ ### Changed
62
+
63
+ - Relay client/server code split into Mastodon- and LitePub-specific classes.
64
+ - Lower retention for the duplicate-activity cache.
65
+ - Bumped `mysql2`, `nanoid`, and `redis` dependencies.
66
+
67
+ ## [0.41.3] - 2026-04-21
68
+
69
+ Hot patch on the `stable` branch.
70
+
71
+ ### Fixed
72
+
73
+ - Errors in `DistributionWorker` are now logged instead of swallowed.
74
+
75
+ ## [0.41.2] - 2026-04-13
76
+
77
+ ### Fixed
78
+
79
+ - `SafeAgent` calls `super.createConnection()` correctly.
80
+
81
+ ## [0.41.1] - 2026-04-13
82
+
83
+ ### Fixed
84
+
85
+ - `trust proxy 1` is interpreted as `1` (integer) so Express parses
86
+ `X-Forwarded-*` correctly.
87
+
88
+ ## [0.41.0] - 2026-04-13
89
+
90
+ ### Added
91
+
92
+ - `trust proxy` enabled in Express.
93
+
94
+ ## [0.40.2] - 2026-04-13
95
+
96
+ ### Fixed
97
+
98
+ - Correct `redis-url` handling in `activitypub-bot.js`.
99
+ - Missing `profile-file` option wired through.
100
+
101
+ ## [0.40.1] - 2026-04-13
102
+
103
+ ### Fixed
104
+
105
+ - Conflicts in integration tests.
106
+
107
+ ## [0.40.0] - 2026-04-13
108
+
109
+ ### Added
110
+
111
+ - Integration test before release.
112
+ - Optional Redis backend for rate-limit storage.
113
+ - Rate limiting on GET and POST with standard `RateLimit-*` headers.
114
+ - Request timeout, maximum size, and maximum redirects for outbound requests.
115
+ - Optional allowance of requests to private IP addresses (off by default).
116
+ - `SafeAgent` performs connection-time private-IP checks to protect
117
+ against SSRF in `ActivityPubClient`.
118
+
119
+ ### Changed
120
+
121
+ - Renamed `RateLimiter` to `RequestThrottler` to reflect its role more
122
+ accurately.
123
+ - `http:` URLs and private-IP hosts are rejected unless explicitly allowed.
124
+
125
+ ### Fixed
126
+
127
+ - Explicit handling of duplicate `resource` parameters on the Webfinger
128
+ endpoint.
129
+
130
+ ## [0.39.6] - 2026-04-11
131
+
132
+ ### Fixed
133
+
134
+ - Validate only minimal derived components when checking a signature.
135
+
136
+ ## [0.39.5] - 2026-04-11
137
+
138
+ ### Fixed
139
+
140
+ - Only include `@method` and `@target-uri` when signing.
141
+
142
+ ## [0.39.4] - 2026-04-10
143
+
144
+ ### Changed
145
+
146
+ - More debugging and error reporting in `ActivityPubClient`.
147
+
148
+ ## [0.39.3] - 2026-04-10
149
+
150
+ ### Changed
151
+
152
+ - Extra debug output for failed RFC 9421 signatures.
153
+
154
+ ## [0.39.2] - 2026-04-10
155
+
156
+ ### Fixed
157
+
158
+ - Send `Content-Digest` (not `Digest`) when signing with RFC 9421.
159
+
160
+ ## [0.39.1] - 2026-04-10
161
+
162
+ ### Fixed
163
+
164
+ - Corrected HTTP error code type in `DistributionWorker`.
165
+ - Logger attributes now include the class name.
166
+
167
+ ## [0.39.0] - 2026-04-10
168
+
169
+ ### Added
170
+
171
+ - RFC 9421 HTTP Message Signatures on outbound `POST` requests.
172
+ - Double-knock in `ActivityPubClient.get()`: fall back to draft-cavage-12
173
+ after an RFC 9421 auth failure and cache the per-origin policy.
174
+ - `SignaturePolicyStorage` backs the cached per-origin signature policy.
175
+ - Remote objects are resolved through a cached proxy when direct load fails.
176
+
177
+ ### Changed
178
+
179
+ - Prefer FEP-C180 problem details on error responses; fall back to
180
+ default problem details otherwise.
181
+ - `app` wires up `ActivityPubClient` with `messageSigner` and `policyStore`.
182
+
183
+ ## [0.38.4] - 2026-04-07
184
+
185
+ ### Fixed
186
+
187
+ - Pre-cache expired context `https://w3id.org/identity/v1`.
188
+
189
+ ## [0.38.3] - 2026-04-07
190
+
191
+ ### Added
192
+
193
+ - Pre-cached DID, security, and GoToSocial contexts.
194
+ - `X-Powered-By` header removed from responses.
195
+ - Structured logging replaces template-literal log lines.
196
+ - Request-ID propagated into per-request log entries.
197
+
198
+ ## [0.38.2] - 2026-04-07
199
+
200
+ ### Fixed
201
+
202
+ - Special-case two objects with the same ID where one is a
203
+ `CryptographicKey`, in `ActivityPubClient.#resolveObject`.
204
+
205
+ ## [0.38.1] - 2026-04-07
206
+
207
+ ### Removed
208
+
209
+ - `p-queue` dependency (no longer needed).
210
+
211
+ ## [0.38.0] - 2026-04-07
212
+
213
+ ### Added
214
+
215
+ - `X-Request-ID` middleware to track requests end-to-end.
216
+
217
+ ### Fixed
218
+
219
+ - Honor the `Date:` header in the `HTTPMessageSignature` validation branch.
220
+
221
+ ## [0.37.1] - 2026-04-04
222
+
223
+ ### Fixed
224
+
225
+ - Better handling of derived components in `HTTPMessageSignature`.
226
+
227
+ ## [0.37.0] - 2026-04-04
228
+
229
+ ### Added
230
+
231
+ - `HTTPMessageSignature` class implementing RFC 9421.
232
+ - Signature authenticator accepts RFC 9421 message signatures alongside
233
+ draft-cavage.
234
+ - `HTTPMessageSignature.created()` helper.
235
+ - `Digester.contentDigest()` for RFC 9421 `Content-Digest`.
236
+
237
+ ### Fixed
238
+
239
+ - Use a regex rather than naive `split()` when parsing `Signature-Input`.
240
+ - Pass full URL to `HTTPMessageSignature.validate()`.
241
+
242
+ ## [0.36.2] - 2026-04-02
243
+
244
+ ### Fixed
245
+
246
+ - Dropped the single-item `alsoKnownAs` value that was triggering a Misskey bug.
247
+
248
+ ## [0.36.1] - 2026-04-01
249
+
250
+ ### Fixed
251
+
252
+ - Cache headers correctly when the stored data is null.
253
+
254
+ ## [0.36.0] - 2026-03-31
255
+
256
+ ### Added
257
+
258
+ - `RemoteObjectCache` class with conditional refresh (`If-None-Match`,
259
+ `If-Modified-Since`).
260
+ - `ActivityPubClient` requires and uses `RemoteObjectCache`.
261
+ - `app` wires `RemoteObjectCache` into the client.
262
+
263
+ ### Changed
264
+
265
+ - Refactored common logic in `ActivityPubClient.#get()`.
266
+
267
+ ## [0.35.0] - 2026-03-30
268
+
269
+ ### Added
270
+
271
+ - `DistributionWorker`, `DeliveryWorker`, and `FanoutWorker` as
272
+ subclasses of a shared `Worker` base.
273
+ - `IntakeWorker` processes shared-inbox intake as a background job.
274
+ - Activity fan-out moved to its own queue.
275
+ - Command-line options documented in the README.
276
+
277
+ ### Changed
278
+
279
+ - Default page size raised from 20 to 256.
280
+ - Slightly better logging for follows.
281
+
282
+ ## [0.34.1] - 2026-03-29
283
+
284
+ ### Changed
285
+
286
+ - Dependency bumps only (no user-visible changes).
287
+
288
+ ## [0.34.0] - 2026-03-29
289
+
290
+ ### Added
291
+
292
+ - Workaround to accept `Follow` activities that omit addressing.
293
+ - Guess Mastodon's 300 requests / 5 minutes rate-limit policy when no
294
+ headers are present.
295
+ - Peek at current rate-limit values.
296
+
297
+ ### Changed
298
+
299
+ - `pendingFollowing` consistently stores activities, not actors.
300
+
301
+ ### Removed
302
+
303
+ - References to the unused `pendingFollowers` collection.
304
+
305
+ ### Fixed
306
+
307
+ - `ActivityHandler.#handleBlock()` checks for a pending follow activity
308
+ rather than a pending actor.
309
+ - Correct handling of pending follow activity during actor block.
310
+ - Test for unfollow correctly uses `pendingFollowing` in `BotContext`.
311
+
312
+ ## [0.33.0] - 2026-03-26
313
+
314
+ ### Added
315
+
316
+ - Webfinger lookup for profile pages.
317
+
318
+ ### Changed
319
+
320
+ - Grudgingly accept the default namespace for security-namespace
321
+ properties when fetching keys and actors.
322
+
323
+ ### Removed
324
+
325
+ - Dead code path for fetching remote public keys in `RemoteKeyStorage`.
326
+
327
+ ### Fixed
328
+
329
+ - Confirm the owner of a remote public key before trusting it.
330
+
331
+ ## [0.32.3] - 2026-03-24
332
+
333
+ ### Fixed
334
+
335
+ - Fail fast on unrecoverable server errors.
336
+ - Respect `Retry-After` delay on 500-class errors when specified.
337
+
338
+ ## [0.32.2] - 2026-03-24
339
+
340
+ ### Added
341
+
342
+ - More robust distribution behavior.
343
+ - Retry after distribution on 429 errors.
344
+
345
+ ## [0.32.1] - 2026-03-24
346
+
347
+ ### Added
348
+
349
+ - Archive failed jobs to a `failed_job` table.
350
+
351
+ ### Fixed
352
+
353
+ - `DistributionWorker` now fails jobs on unrecoverable errors.
354
+
355
+ ## [0.32.0] - 2026-03-24
356
+
357
+ ### Added
358
+
359
+ - Profile page route for bots (`/profile/{botid}`).
360
+ - Custom icon and image for bots.
361
+ - Profile page link in Webfinger output.
362
+ - URL property on the actor pointing at the profile page.
363
+ - Discovery link on the profile page.
364
+ - `UrlFormatter.formatProfile()` and companion format/unformat methods
365
+ for icon and image.
366
+
367
+ ### Changed
368
+
369
+ - Profile page centered in body. (#154)
370
+
371
+ ### Fixed
372
+
373
+ - Count of links in Webfinger results.
374
+
375
+ ## [0.31.1] - 2026-03-22
376
+
377
+ ### Changed
378
+
379
+ - Block activities with no `id` from the shared inbox.
380
+
381
+ ### Fixed
382
+
383
+ - Reject activities with no `id` at the inbox.
384
+
385
+ ## [0.31.0] - 2026-03-22
386
+
387
+ ### Added
388
+
389
+ - Dedicated server actor bot; routes, Webfinger, and documentation
390
+ updated accordingly.
391
+ - `DoNothingBot` accepts custom parameters.
392
+ - Bots can declare whether they need HTTP signature verification.
393
+ - `UrlFormatter` exposes a `hostname` getter.
394
+
395
+ ### Changed
396
+
397
+ - `ActivityPubClient` uses the server actor for signed key-fetch
398
+ requests; no special-case.
399
+ - Server actor ID is now derived from the domain name.
400
+
401
+ ### Removed
402
+
403
+ - Server special case in Webfinger routes and unused server routes.
404
+ - HTTP-signature check for server actor, Webfinger, and health endpoints.
405
+
406
+ ### Fixed
407
+
408
+ - `KeyStorage` no longer accepts `null` username.
409
+ - Don't verify signatures for the server actor itself.
410
+
411
+ ## [0.30.6] - 2026-03-21
412
+
413
+ ### Fixed
414
+
415
+ - Skip HTTP-signature verification for server, Webfinger, and health endpoints.
416
+
417
+ ## [0.30.5] - 2026-03-21
418
+
419
+ ### Added
420
+
421
+ - Rate-limit header parsing supports either dates or integers.
422
+
423
+ ## [0.30.4] - 2026-03-21
424
+
425
+ ### Fixed
426
+
427
+ - Correct protocol for homepage URL.
428
+
429
+ ## [0.30.3] - 2026-03-21
430
+
431
+ ### Added
432
+
433
+ - `name` on server actor.
434
+
435
+ ## [0.30.2] - 2026-03-21
436
+
437
+ ### Fixed
438
+
439
+ - Correct `preferredUsername` for server actor.
440
+
441
+ ## [0.30.1] - 2026-03-21
442
+
443
+ ### Fixed
444
+
445
+ - Wait test for `ActivityPubClient`.
446
+
447
+ ## [0.30.0] - 2026-03-21
448
+
449
+ ### Changed
450
+
451
+ - Rate limiter switched to a greedy algorithm.
452
+ - More logging info on failed requests.
453
+
454
+ ### Fixed
455
+
456
+ - Additional reference fixes for `ActivityHandler.#doActivity()`.
457
+ - Errors in reply and follow handling.
458
+ - Don't expose `botId '*'` publicly in `BotContext`.
459
+ - More robust argument checks in `ActivityPubClient`.
460
+ - Argument checks in `KeyStorage`.
461
+
462
+ ## [0.29.0] - 2026-03-19
463
+
464
+ ### Added
465
+
466
+ - Webfinger routes for both bot actors and the server actor.
467
+ - HTTPS Webfinger support.
468
+ - `UrlFormatter.acct()` for `acct:` URI formatting.
469
+
470
+ ## [0.28.7] - 2026-03-19
471
+
472
+ ### Fixed
473
+
474
+ - Larger body-size limit for incoming JSON data.
475
+
476
+ ## [0.28.6] - 2026-03-19
477
+
478
+ ### Fixed
479
+
480
+ - Support `keyId` with a parameter in the signature header.
481
+
482
+ ## [0.28.5] - 2026-03-18
483
+
484
+ ### Added
485
+
486
+ - More logging in `HTTPSignatureAuthenticator`.
487
+ - More robust handling of server responses.
488
+
489
+ ## [0.28.4] - 2026-03-18
490
+
491
+ ### Added
492
+
493
+ - Better handling of fragment URIs in `ActivityPubClient`.
494
+
495
+ ## [0.28.3] - 2026-03-18
496
+
497
+ ### Added
498
+
499
+ - Embed `publicKey` in the server actor.
500
+
501
+ ## [0.28.2] - 2026-03-18
502
+
503
+ ### Fixed
504
+
505
+ - Rate-limit test epsilon consistent everywhere.
506
+
507
+ ## [0.28.1] - 2026-03-18
508
+
509
+ ### Fixed
510
+
511
+ - Grow the epsilon for the `ActivityPubClient` test.
512
+
513
+ ## [0.28.0] - 2026-03-18
514
+
515
+ ### Changed
516
+
517
+ - Server actor moved to `/actor`.
518
+
519
+ ## [0.27.1] - 2026-03-17
520
+
521
+ ### Fixed
522
+
523
+ - More breathing room in the rate-limit test.
524
+
525
+ ## [0.27.0] - 2026-03-17
526
+
527
+ ### Added
528
+
529
+ - `ActivityPubClient` respects rate limits via a `RateLimiter` argument.
530
+ - `RateLimiter` class.
531
+
532
+ ## [0.26.3] - 2026-03-17
533
+
534
+ ### Fixed
535
+
536
+ - Better handling of `Accept` header for root URL.
537
+
538
+ ## [0.26.2] - 2026-03-17
539
+
540
+ ### Fixed
541
+
542
+ - Better error when a key is not found.
543
+
544
+ ## [0.26.1] - 2026-03-17
545
+
546
+ ### Fixed
547
+
548
+ - Timestamps on collections.
549
+
550
+ ## [0.26.0] - 2026-03-17
551
+
552
+ ### Changed
553
+
554
+ - `BotContext.announceObject()` takes an `actors` argument.
555
+
556
+ ### Fixed
557
+
558
+ - Better handling of objects without owners or names.
559
+
560
+ ## [0.25.1] - 2026-03-17
561
+
562
+ ### Fixed
563
+
564
+ - `BotFactory` also supports `actorOK()`.
565
+ - Relay client deletes the follow activity instead of setting it to null.
566
+
567
+ ## [0.25.0] - 2026-03-16
568
+
569
+ ### Added
570
+
571
+ - `FollowBackBot` that follows back automatically and undoes its follow
572
+ when unfollowed.
573
+ - Undo-Follow callback on the `Bot` interface.
574
+ - `BotContext` silently succeeds on duplicate follow.
575
+
576
+ ### Changed
577
+
578
+ - Exported `FollowBackBot`.
579
+
580
+ ## [0.24.2] - 2026-03-12
581
+
582
+ ### Added
583
+
584
+ - Handle `Accept` and `Reject` for relay follow activities.
585
+
586
+ ## [0.24.1] - 2026-03-12
587
+
588
+ ### Fixed
589
+
590
+ - Send the full `Public` URL for relay follow/unfollow.
591
+ - Log at `info` instead of `debug` in relay client.
592
+
593
+ ## [0.24.0] - 2026-03-11
594
+
595
+ ### Added
596
+
597
+ - Unsubscribe from relay (#91).
598
+
599
+ ## [0.23.0] - 2026-03-11
600
+
601
+ ### Added
602
+
603
+ - Configurable worker counts and index file.
604
+ - Command-line script covered by tests.
605
+ - Documentation for delivery, distribution, and the index file.
606
+
607
+ ### Changed
608
+
609
+ - Default distribution worker count is now 8.
610
+
611
+ ## [0.22.0] - 2026-03-11
612
+
613
+ ### Added
614
+
615
+ - Index page. (#118)
616
+
617
+ ### Changed
618
+
619
+ - `makeApp()` takes keyword arguments.
620
+
621
+ ## [0.21.2] - 2026-03-09
622
+
623
+ ### Added
624
+
625
+ - Reaper for stalled/crashed jobs; releases stalled jobs back to the queue.
626
+ - Wake sleeping workers when a new job is enqueued.
627
+
628
+ ### Changed
629
+
630
+ - Better handling of collections as recipients in `Authorizer`.
631
+ - Better locking for Postgres in `JobQueue`.
632
+ - Database errors bubble up.
633
+
634
+ ### Fixed
635
+
636
+ - Correct retry behaviour.
637
+ - Await delivery properly.
638
+ - Use workers in tests.
639
+ - Better queue handling in `activityhandler.test.js`.
640
+ - `app` wires `jobQueue` and `distributionWorkers` correctly.
641
+
642
+ ## [0.21.1] - 2026-02-25
643
+
644
+ ### Fixed
645
+
646
+ - Correct `summary` property. (#119)
647
+
648
+ ## [0.21.0] - 2026-02-18
649
+
650
+ ### Added
651
+
652
+ - Persistent job queue backed by the database.
653
+ - `DistributionWorker` class.
654
+ - `DeliveryWorker` for local delivery.
655
+ - Retry after a period of time.
656
+ - `IntakeWorker` for shared-inbox intake.
657
+ - Distribute public activities to the bot inbox as well as the shared
658
+ inbox (with deduplication).
659
+
660
+ ### Changed
661
+
662
+ - Single queue used by `ActivityDistributor`.
663
+
664
+ ### Removed
665
+
666
+ - Unused properties and constants from `ActivityDeliverer`.
667
+
668
+ ## [0.20.1] - 2026-02-18
669
+
670
+ ### Fixed
671
+
672
+ - Description for relay server.
673
+
674
+ ## [0.20.0] - 2026-02-18
675
+
676
+ ### Added
677
+
678
+ - Export `RelayClientBot` and `RelayServerBot`.
679
+
680
+ ## [0.19.0] - 2026-02-17
681
+
682
+ ### Changed
683
+
684
+ - Large test-suite cleanup: database isolation, cleanup helpers, unique
685
+ hostnames across tests.
686
+ - Consistent lowercase aliases in `ActorStorage` and `ObjectStorage`
687
+ queries for Postgres/SQLite compatibility.
688
+
689
+ ### Fixed
690
+
691
+ - Better table-existence check for Postgres.
692
+ - Postgres migrations run inside a lock to prevent conflicts.
693
+ - SQLite-memory URL no longer used (broke in Node 25).
694
+ - `ActorStorage` handles mixed-case and lowercase keys.
695
+
696
+ ## [0.18.0] - 2026-02-10
697
+
698
+ ### Added
699
+
700
+ - Accept `hs2019` HTTP signatures.
701
+
702
+ ## [0.17.0] - 2026-02-10
703
+
704
+ ### Added
705
+
706
+ - `RelayServerBot` class.
707
+ - `Bot.handleActivity()` hook to skip default activity handling.
708
+ - `BotContext.doActivity()` method.
709
+ - `RelayClientBot`.
710
+ - Bots can allowlist specific HTTP-signature authors.
711
+
712
+ ### Fixed
713
+
714
+ - Prevent duplicate relay clients.
715
+ - Better debug output for `app.onIdle()`.
716
+ - Always lower-case `type` in the URL formatter.
717
+
718
+ ## [0.16.7] - 2026-01-30
719
+
720
+ ### Added
721
+
722
+ - More info included on Undo activities.
723
+
724
+ ## [0.16.6] - 2026-01-28
725
+
726
+ ### Fixed
727
+
728
+ - Correct recipients of Undo-Announce.
729
+
730
+ ## [0.16.5] - 2026-01-28
731
+
732
+ ### Changed
733
+
734
+ - Refactored `BotContext.#undoActivity()` for clarity.
735
+
736
+ ## [0.16.4] - 2026-01-28
737
+
738
+ ### Fixed
739
+
740
+ - Use bot key as username.
741
+
742
+ ## [0.16.3] - 2026-01-28
743
+
744
+ ### Fixed
745
+
746
+ - Stray include in `ActorStorage`.
747
+
748
+ ## [0.16.2] - 2026-01-28
749
+
750
+ ### Removed
751
+
752
+ - Stray `console.log()`.
753
+
754
+ ## [0.16.1] - 2026-01-28
755
+
756
+ ### Fixed
757
+
758
+ - Debug logging in `botcontext.test.js`.
759
+
760
+ ## [0.16.0] - 2026-01-28
761
+
762
+ ### Added
763
+
764
+ - `BotContext.unannounceObject(obj)`.
765
+ - `lastactivity` table for efficient undos.
766
+ - `ActorStorage` last-activity helpers.
767
+
768
+ ### Changed
769
+
770
+ - Refactored `BotContext` to send activities via a helper and look up
771
+ the most recent activity for undos.
772
+
773
+ ## [0.15.4] - 2026-01-27
774
+
775
+ ### Fixed
776
+
777
+ - Error when filtering pages containing a single item.
778
+
779
+ ## [0.15.3] - 2026-01-26
780
+
781
+ ### Fixed
782
+
783
+ - `package-lock.json`.
784
+
785
+ ## [0.15.2] - 2026-01-26
786
+
787
+ ### Fixed
788
+
789
+ - `package-lock.json` version.
790
+
791
+ ## [0.15.1] - 2026-01-26
792
+
793
+ ### Fixed
794
+
795
+ - `package.json` entry for `activitypub-nock`.
796
+
797
+ ## [0.15.0] - 2026-01-26
798
+
799
+ ### Added
800
+
801
+ - Deliver to remote collections (`followers`, `following`, generic).
802
+ - Distribute to local collections.
803
+
804
+ ## [0.14.2] - 2026-01-25
805
+
806
+ ### Fixed
807
+
808
+ - Skip items in a collection where the read-access check errors.
809
+
810
+ ## [0.14.1] - 2026-01-25
811
+
812
+ ### Fixed
813
+
814
+ - Better format for `shares` collection `Add`.
815
+
816
+ ## [0.14.0] - 2026-01-25
817
+
818
+ ### Added
819
+
820
+ - Correctly generate an `Add` activity when an object is liked.
821
+
822
+ ### Changed
823
+
824
+ - Use 202 Accepted for inbox responses.
825
+ - `ActivityDeliverer` uses a queue for delivery.
826
+
827
+ ### Fixed
828
+
829
+ - More robust behavior when local objects contain bad data.
830
+
831
+ ## [0.13.14] - 2026-01-23
832
+
833
+ ### Changed
834
+
835
+ - Nock helpers extracted into the `@evanp/activitypub-nock` package for re-use.
836
+
837
+ ## [0.13.13] - 2026-01-22
838
+
839
+ ### Changed
840
+
841
+ - `#doActivity()` sets `actor`, `id`, `published`, and `updated`.
842
+
843
+ ### Fixed
844
+
845
+ - Fall back to the user in URL as owner if it's a local object.
846
+
847
+ ## [0.13.12] - 2026-01-22
848
+
849
+ ### Fixed
850
+
851
+ - More robust bot-actor generation.
852
+
853
+ ## [0.13.11] - 2026-01-22
854
+
855
+ ### Fixed
856
+
857
+ - Don't redeliver an activity that's already in the inbox.
858
+
859
+ ## [0.13.10] - 2026-01-22
860
+
861
+ ### Added
862
+
863
+ - Better handling of null key material in the database.
864
+
865
+ ## [0.13.9] - 2026-01-22
866
+
867
+ ### Fixed
868
+
869
+ - `bot.ok.test` no longer depends on ordering.
870
+
871
+ ## [0.13.8] - 2026-01-22
872
+
873
+ ### Added
874
+
875
+ - More debug logging for `OKBot`.
876
+
877
+ ## [0.13.7] - 2026-01-22
878
+
879
+ ### Added
880
+
881
+ - More logging during activity delivery.
882
+
883
+ ## [0.13.6] - 2026-01-22
884
+
885
+ ### Added
886
+
887
+ - Logging for received activities.
888
+
889
+ ## [0.13.5] - 2026-01-22
890
+
891
+ ### Fixed
892
+
893
+ - `KeyStorage` uses a zero-length string for the system key.
894
+
895
+ ## [0.13.4] - 2026-01-22
896
+
897
+ ### Fixed
898
+
899
+ - `OKBot` works in the public inbox context.
900
+
901
+ ## [0.13.3] - 2026-01-22
902
+
903
+ ### Fixed
904
+
905
+ - Symlink global libs into `/app/` inside Docker.
906
+
907
+ ## [0.13.2] - 2026-01-22
908
+
909
+ ### Fixed
910
+
911
+ - Path issues in Dockerfile.
912
+
913
+ ## [0.13.1] - 2026-01-22
914
+
915
+ ### Added
916
+
917
+ - `.npmignore` to exclude unnecessary files.
918
+
919
+ ### Fixed
920
+
921
+ - Proper path for the `activitypub-bot` script.
922
+
923
+ ## [0.13.0] - 2026-01-22
924
+
925
+ ### Added
926
+
927
+ - Default bot classes exported from the library.
928
+
929
+ ### Fixed
930
+
931
+ - Workaround for Express 5 disallowing regexes in routes.
932
+
933
+ ## [0.12.1] - 2026-01-21
934
+
935
+ ### Fixed
936
+
937
+ - Default bots file wired up from `bin`.
938
+
939
+ ## [0.12.0] - 2026-01-21
940
+
941
+ ### Changed
942
+
943
+ - Simplified Dockerfile.
944
+ - Reorganized top-level scripts and packaged the library.
945
+
946
+ ## [0.11.0] - 2026-01-21
947
+
948
+ ### Added
949
+
950
+ - `BotContext.announceObject()`.
951
+ - `onAnnounce()` callback when an actor's object is shared (#56).
952
+ - Thread-context registration for performance.
953
+ - Deliver to local members of a remote collection through the shared inbox.
954
+ - `ActivityPubClient.items(collection)` async iterator for paged and
955
+ ordered collections.
956
+
957
+ ### Changed
958
+
959
+ - Express bumped from 4.x to 5.x.
960
+
961
+ ### Fixed
962
+
963
+ - Better handling of `null` in `KeyStorage`.
964
+
965
+ ## [0.10.0] - 2026-01-15
966
+
967
+ ### Added
968
+
969
+ - Handle public messages.
970
+ - Delivery to followers via shared inbox.
971
+ - `sharedInbox` endpoint on the actor.
972
+ - Utility to look up usernames that have a given item in a collection.
973
+ - Deliver activities to local `followers` and `following` collections.
974
+ - Delivery to remote `following` collections.
975
+ - Webfinger lookup tools in `BotContext`.
976
+ - `BotContext.sendReply()`.
977
+ - Microsyntax transformation (hashtags, URLs, mentions) in `BotContext`.
978
+
979
+ ### Changed
980
+
981
+ - Six delivery cases rationalized: public, local actor, local collection,
982
+ remote actor, remote collection, other.
983
+ - Delivery code moved into `ActivityDeliverer`.
984
+
985
+ ### Fixed
986
+
987
+ - `ActivityDistributor` won't distribute an activity back to the actor.
988
+ - Correct type for `Hashtag` in microsyntax.
989
+
990
+ ## [0.9.0] - 2026-01-10
991
+
992
+ ### Added
993
+
994
+ - `thread` and thread-page routes.
995
+ - Thread collection management for remote objects.
996
+ - `BotContext.duplicate()`.
997
+ - `BotFactory` support for dynamically-provisioned bots: actor routes,
998
+ collections, public key, and inbox handling.
999
+ - FEP-5711 inverse properties (`replies`, `likes`, `shares`) on actors
1000
+ and new content.
1001
+
1002
+ ### Fixed
1003
+
1004
+ - Conversation tracking in replies.
1005
+ - Reactions and thread on new content.
1006
+ - `inReplyTo` for OK bot.
1007
+ - Correct origin in `actorstorage.test.js`.
1008
+ - `UrlFormatter.getUserName()` uses `unformat()`.
1009
+
1010
+ ## [0.8.0] - 2025-09-13
1011
+
1012
+ ### Added
1013
+
1014
+ - Inverse properties on `replies`, `likes`, and `shares`.
1015
+
1016
+ ## [0.7.5] - 2025-06-03
1017
+
1018
+ ### Fixed
1019
+
1020
+ - Don't handle the same activity a second time.
1021
+
1022
+ ## [0.7.4] - 2025-06-03
1023
+
1024
+ ### Changed
1025
+
1026
+ - Additional error checks on collection operations.
1027
+
1028
+ ## [0.7.3] - 2025-06-03
1029
+
1030
+ ### Fixed
1031
+
1032
+ - Outbox route when it contains activities.
1033
+
1034
+ ## [0.7.2] - 2025-06-03
1035
+
1036
+ ### Fixed
1037
+
1038
+ - `Authorizer.canRead()` checks for object and object.id.
1039
+ - `HTTPSignature` uses query params when building the signing string.
1040
+ - Silent logger for `HTTPSignature`.
1041
+ - `HTTPSignature` handles URLs with parameters.
1042
+
1043
+ ## [0.7.1] - 2025-05-23
1044
+
1045
+ ### Fixed
1046
+
1047
+ - Quietly fail when delivering to actors with no inbox.
1048
+
1049
+ ## [0.7.0] - 2025-05-22
1050
+
1051
+ ### Added
1052
+
1053
+ - `OKBot` replies at most once to a mention.
1054
+ - `BotContext.hasData()`.
1055
+ - Logger on `BotContext`.
1056
+ - Logging in `OKBot`.
1057
+ - Class name in logger output.
1058
+
1059
+ ## [0.6.0] - 2025-05-22
1060
+
1061
+ ### Added
1062
+
1063
+ - Robustness to key rotation.
1064
+ - Option to skip the cache in `RemoteKeyStorage`.
1065
+
1066
+ ### Fixed
1067
+
1068
+ - Future and past dates.
1069
+
1070
+ ## [0.5.7] - 2025-05-17
1071
+
1072
+ ### Fixed
1073
+
1074
+ - `OKBot` mentions the sender correctly.
1075
+
1076
+ ## [0.5.6] - 2025-05-17
1077
+
1078
+ ### Fixed
1079
+
1080
+ - Better table and queries for `RemotePublicKey`.
1081
+ - Actually save local public and private keys.
1082
+
1083
+ ## [0.5.5] - 2025-05-17
1084
+
1085
+ ### Added
1086
+
1087
+ - Log public/private key access.
1088
+
1089
+ ### Fixed
1090
+
1091
+ - Trim `target` and `host` in `HTTPSignature`.
1092
+
1093
+ ## [0.5.4] - 2025-05-16
1094
+
1095
+ ### Changed
1096
+
1097
+ - Use a list for headers in `HTTPSignature` to make signing replicable.
1098
+ - Better escaping and trimming in `HTTPSignature`.
1099
+
1100
+ ## [0.5.3] - 2025-05-16
1101
+
1102
+ ### Fixed
1103
+
1104
+ - Digester test regression.
1105
+
1106
+ ## [0.5.2] - 2025-05-16
1107
+
1108
+ ### Fixed
1109
+
1110
+ - Signature-header match regex in tests.
1111
+
1112
+ ## [0.5.1] - 2025-05-16
1113
+
1114
+ ### Added
1115
+
1116
+ - Packaging fixes for the signing work in 0.5.0.
1117
+
1118
+ ## [0.5.0] - 2025-05-16
1119
+
1120
+ ### Added
1121
+
1122
+ - Sign `Accept`, `Content-Type`, and `User-Agent` headers.
1123
+
1124
+ ## [0.4.10] - 2025-05-16
1125
+
1126
+ ### Added
1127
+
1128
+ - More HTTP-signature debugging output.
1129
+
1130
+ ## [0.4.9] - 2025-05-15
1131
+
1132
+ ### Added
1133
+
1134
+ - Debug output for HTTP signatures.
1135
+
1136
+ ## [0.4.8] - 2025-05-14
1137
+
1138
+ ### Changed
1139
+
1140
+ - All HTTP-signature and digest methods consolidated into dedicated modules.
1141
+
1142
+ ## [0.4.7] - 2025-05-14
1143
+
1144
+ ### Changed
1145
+
1146
+ - Compare digest algorithms case-independently.
1147
+
1148
+ ## [0.4.6] - 2025-05-14
1149
+
1150
+ ### Fixed
1151
+
1152
+ - Better handling of key IDs with a fragment.
1153
+
1154
+ ## [0.4.5] - 2025-05-13
1155
+
1156
+ ### Added
1157
+
1158
+ - Better error reporting in the distributor.
1159
+ - Log bad incoming activities.
1160
+
1161
+ ## [0.4.4] - 2025-05-13
1162
+
1163
+ ### Fixed
1164
+
1165
+ - Better `Digest` and `Date` validation, with better error messages.
1166
+
1167
+ ## [0.4.3] - 2025-05-13
1168
+
1169
+ ### Fixed
1170
+
1171
+ - Bad `Digest` value on outgoing HTTP requests.
1172
+
1173
+ ## [0.4.2] - 2025-05-13
1174
+
1175
+ ### Fixed
1176
+
1177
+ - Correct method in POST signature.
1178
+
1179
+ ## [0.4.1] - 2025-05-13
1180
+
1181
+ ### Fixed
1182
+
1183
+ - Common logger used for `ActivityDistributor`.
1184
+
1185
+ ## [0.4.0] - 2025-05-13
1186
+
1187
+ ### Added
1188
+
1189
+ - `LOG_LEVEL` environment variable.
1190
+
1191
+ ### Fixed
1192
+
1193
+ - Better handling of remote keys with their own URL.
1194
+ - Use `CryptographicKey` rather than `PublicKey`.
1195
+
1196
+ ## [0.3.4] - 2025-05-13
1197
+
1198
+ ### Fixed
1199
+
1200
+ - Client doesn't sign requests for HTTP-signature keys unless necessary.
1201
+
1202
+ ## [0.3.3] - 2025-05-12
1203
+
1204
+ ### Fixed
1205
+
1206
+ - Webfinger endpoint works correctly.
1207
+
1208
+ ## [0.3.2] - 2025-05-12
1209
+
1210
+ ### Fixed
1211
+
1212
+ - Copy `lib` and `bots` to the correct directories in Docker.
1213
+ - Multiplatform Docker image.
1214
+
1215
+ ## [0.3.1] - 2025-05-12
1216
+
1217
+ ### Fixed
1218
+
1219
+ - Copy `bots` directory in Docker.
1220
+
1221
+ ## [0.3.0] - 2025-05-12
1222
+
1223
+ ### Added
1224
+
1225
+ - Standard bot classes and a new bot architecture.
1226
+ - Start script.
1227
+
1228
+ ## [0.2.0] - 2025-05-11
1229
+
1230
+ ### Added
1231
+
1232
+ - Docker image built on tag.
1233
+ - `/livez` and `/readyz` health-check routes.
1234
+
1235
+ ## [0.1.0] - 2025-05-10
1236
+
1237
+ ### Added
1238
+
1239
+ - Initial release: ActivityPub bot framework with Webfinger, actor
1240
+ routes, inbox/outbox, shared inbox, HTTP Signatures, object and actor
1241
+ storage, key storage, bot context API, activity distribution, and
1242
+ default bots (`OKBot`, `DoNothingBot`).
1243
+ - Sequelize drivers for SQLite, Postgres, and MySQL.
1244
+ - Docker multi-platform build workflow.
1245
+ - Dependabot configuration.