@fedify/fedify 2.4.0-dev.2190 → 2.4.0-dev.2193

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/{builder-CFF0YNTp.mjs → builder-0onlMY4u.mjs} +25 -5
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{compound-proof-F2jjkrt0.mjs → compound-proof-B-Fk6Slo.mjs} +2 -2
  4. package/dist/{deno-EopndaNb.mjs → deno-DB_Sh0LK.mjs} +1 -1
  5. package/dist/{docloader-u6zzOExF.mjs → docloader-DpWYYY6a.mjs} +2 -2
  6. package/dist/federation/builder.test.mjs +1 -1
  7. package/dist/federation/compound-fanout.test.mjs +3 -3
  8. package/dist/federation/handler-compound-proof.test.mjs +52 -3
  9. package/dist/federation/handler.test.mjs +5 -5
  10. package/dist/federation/hashlink-media.test.mjs +2 -2
  11. package/dist/federation/idempotency.test.mjs +2 -2
  12. package/dist/federation/metrics.test.mjs +1 -1
  13. package/dist/federation/middleware.test.mjs +52 -7
  14. package/dist/federation/mod.cjs +1 -1
  15. package/dist/federation/mod.js +1 -1
  16. package/dist/federation/outgoing-proof.test.mjs +5 -5
  17. package/dist/federation/portable-actor.test.mjs +3 -3
  18. package/dist/federation/portable-chain.test.mjs +3 -3
  19. package/dist/federation/portable-collection.test.mjs +4 -4
  20. package/dist/federation/portable-gateway-keys.test.mjs +4 -4
  21. package/dist/federation/portable-inbox.test.mjs +4 -4
  22. package/dist/federation/portable-parse-uri.test.mjs +1 -1
  23. package/dist/federation/portable-route-activity.test.mjs +2 -2
  24. package/dist/federation/portable.test.mjs +49 -5
  25. package/dist/federation/send.test.mjs +3 -3
  26. package/dist/federation/tasks/enqueue.test.mjs +1 -1
  27. package/dist/federation/tasks/tasks.test.mjs +2 -2
  28. package/dist/federation/temporal.test.mjs +1 -1
  29. package/dist/federation/webfinger.test.mjs +1 -1
  30. package/dist/{federation-BSS2dUO7.cjs → federation-BsGo0EH2.cjs} +41 -17
  31. package/dist/{http-CCr2_ipG.cjs → http-BEivI0TS.cjs} +44 -2
  32. package/dist/{http-BqN5kyUf.js → http-BGmxtpo2.js} +45 -3
  33. package/dist/{http-Y1ObT1A8.mjs → http-DQf9Mw4V.mjs} +4 -4
  34. package/dist/{key-DyXf88bq.mjs → key-DA3Yx8p2.mjs} +2 -2
  35. package/dist/{kv-cache-DUXluAc0.cjs → kv-cache-1hafSoqH.cjs} +1 -1
  36. package/dist/{kv-cache-C02XitwK.js → kv-cache-DduYhpee.js} +1 -1
  37. package/dist/{kv-cache-C8YjNAi_.mjs → kv-cache-OFBvrKh3.mjs} +1 -1
  38. package/dist/{ld-oQj6j_hP.mjs → ld-C15yzuY6.mjs} +3 -3
  39. package/dist/{metrics-zMe834ID.mjs → metrics-B1H23mlq.mjs} +1 -1
  40. package/dist/{middleware-Ck9yghxs.mjs → middleware-BZQnf0nI.mjs} +1 -1
  41. package/dist/{middleware-Bdu2-OPD.mjs → middleware-BqqycC0P.mjs} +29 -25
  42. package/dist/{middleware-CaR2MRWY.js → middleware-ClaUFaLb.js} +41 -17
  43. package/dist/{mod-Ck9_lSJB.d.ts → mod-Cy9VNHVw.d.ts} +12 -1
  44. package/dist/{mod-DHTuu3l8.d.cts → mod-DoTWIc7F.d.cts} +12 -1
  45. package/dist/mod.cjs +4 -4
  46. package/dist/mod.d.cts +1 -1
  47. package/dist/mod.d.ts +1 -1
  48. package/dist/mod.js +4 -4
  49. package/dist/nodeinfo/handler.test.mjs +1 -1
  50. package/dist/{owner-Dem4fbwc.mjs → owner-BVpZBM-V.mjs} +3 -3
  51. package/dist/{portable-collection-DJe_bk50.cjs → portable-collection-BFSShzwh.cjs} +1 -1
  52. package/dist/{portable-collection-BEqLrMW3.js → portable-collection-D535cSz_.js} +1 -1
  53. package/dist/{portable-collection-BL6aZlQ0.mjs → portable-collection-Dn2GdZdI.mjs} +2 -2
  54. package/dist/{portable-key-Duue9Y2Y.mjs → portable-key-Bmwmq7Y6.mjs} +1 -1
  55. package/dist/{proof-C9115DX_.mjs → proof-DrJWKeOl.mjs} +48 -6
  56. package/dist/{send-D0hxFFRB.mjs → send-CT3a-0Vd.mjs} +3 -3
  57. package/dist/sig/compound-proof-discovery.test.mjs +1 -1
  58. package/dist/sig/compound-proof-producer.test.mjs +1 -1
  59. package/dist/sig/compound-proof-verification.test.mjs +2 -2
  60. package/dist/sig/compound-proof.test.mjs +2 -2
  61. package/dist/sig/http.test.mjs +2 -2
  62. package/dist/sig/key.test.mjs +1 -1
  63. package/dist/sig/ld.test.mjs +2 -2
  64. package/dist/sig/mod.cjs +2 -2
  65. package/dist/sig/mod.d.cts +1 -1
  66. package/dist/sig/mod.d.ts +1 -1
  67. package/dist/sig/mod.js +2 -2
  68. package/dist/sig/owner.test.mjs +1 -1
  69. package/dist/sig/portable-collection.test.mjs +1 -1
  70. package/dist/sig/portable-key.test.mjs +6 -6
  71. package/dist/sig/proof.test.mjs +141 -7
  72. package/dist/{temporal-DKchpKyp.mjs → temporal-DNqluyEc.mjs} +1 -1
  73. package/dist/testing/kv.test.mjs +1 -1
  74. package/dist/utils/docloader.test.mjs +2 -2
  75. package/dist/utils/kv-cache.test.mjs +1 -1
  76. package/dist/utils/mod.cjs +1 -1
  77. package/dist/utils/mod.js +1 -1
  78. package/package.json +6 -6
@@ -2,7 +2,7 @@ import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as ed25519PrivateKey, r as ed25519PublicKey } from "../keys-DIJNHW-Y.mjs";
5
- import { t as verifyPortableObject } from "../portable-collection-BL6aZlQ0.mjs";
5
+ import { t as verifyPortableObject } from "../portable-collection-Dn2GdZdI.mjs";
6
6
  import { Collection, CollectionPage, Note, OrderedCollection, Person, traverseCollection } from "@fedify/vocab";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { FetchError, encodeMultibase, exportDidKey, preloadedContexts } from "@fedify/vocab-runtime";
@@ -2,13 +2,13 @@ import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
5
- import { a as fetchKeyDetailed, i as fetchKey } from "../key-DyXf88bq.mjs";
6
- import { h as verifyJsonLd, p as signJsonLd } from "../ld-oQj6j_hP.mjs";
7
- import { d as verifyProof, r as createProof } from "../proof-C9115DX_.mjs";
8
- import { n as resolvePortableActorKey } from "../portable-key-Duue9Y2Y.mjs";
9
- import { f as verifyRequest, l as signRequest, p as verifyRequestDetailed } from "../http-Y1ObT1A8.mjs";
5
+ import { a as fetchKeyDetailed, i as fetchKey } from "../key-DA3Yx8p2.mjs";
6
+ import { h as verifyJsonLd, p as signJsonLd } from "../ld-C15yzuY6.mjs";
7
+ import { d as verifyProof, r as createProof } from "../proof-DrJWKeOl.mjs";
8
+ import { n as resolvePortableActorKey } from "../portable-key-Bmwmq7Y6.mjs";
9
+ import { f as verifyRequest, l as signRequest, p as verifyRequestDetailed } from "../http-DQf9Mw4V.mjs";
10
10
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2 } from "../keys-DIJNHW-Y.mjs";
11
- import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-Dem4fbwc.mjs";
11
+ import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-BVpZBM-V.mjs";
12
12
  import { t as KvKeyCache } from "../keycache-Da8A8mZa.mjs";
13
13
  import { Create, CryptographicKey, Multikey, Note, Person } from "@fedify/vocab";
14
14
  import { test } from "@fedify/fixture";
@@ -10,10 +10,10 @@ import "../std__assert-DvMDRPes.mjs";
10
10
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
11
11
  import { t as assert } from "../assert-D1Eafmd_.mjs";
12
12
  import { r as normalizeOutgoingActivityJsonLd } from "../outgoing-jsonld-4IJqPYos.mjs";
13
- import { a as signObject, c as verifyPortableObjectProof, d as verifyProof, i as hasProofLike, r as createProof, s as verifyObject } from "../proof-C9115DX_.mjs";
14
- import { f as verifyRequest } from "../http-Y1ObT1A8.mjs";
13
+ import { a as signObject, c as verifyPortableObjectProof, d as verifyProof, i as hasProofLike, r as createProof, s as verifyObject } from "../proof-DrJWKeOl.mjs";
14
+ import { f as verifyRequest } from "../http-DQf9Mw4V.mjs";
15
15
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
16
- import { t as getAuthenticatedDocumentLoader } from "../docloader-u6zzOExF.mjs";
16
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DpWYYY6a.mjs";
17
17
  import { Create, DataIntegrityProof, Document, Multikey, Note, PUBLIC_COLLECTION, Place, Translation } from "@fedify/vocab";
18
18
  import { createTestMeterProvider, mockDocumentLoader, test } from "@fedify/fixture";
19
19
  import { decodeMultibase, encodeMultibase, exportDidKey, exportMultibaseKey, formatIri, importMultibaseKey, parseIri } from "@fedify/vocab-runtime";
@@ -33,6 +33,7 @@ const portableDid = await exportDidKey(ed25519PublicKey.publicKey);
33
33
  const portableDidMethod = portableDid.substring(8);
34
34
  const portableKeyId = new URL(`${portableDid}#${portableDidMethod}`);
35
35
  const portableContext = ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/data-integrity/v1"];
36
+ const portableActorContext = [...portableContext, "https://w3id.org/fep/ef61"];
36
37
  const portableProofCreated = "2023-02-24T23:36:38Z";
37
38
  async function signPortableJsonLd(document, { privateKey = ed25519PrivateKey, verificationMethod = portableKeyId, proofOptions = {} } = {}) {
38
39
  const proofConfig = {
@@ -933,11 +934,12 @@ test("verifyPortableObjectProof()", async (t) => {
933
934
  });
934
935
  await t.step("verifies portable actors and activities by shape", async () => {
935
936
  for (const document of [{
936
- "@context": portableContext,
937
+ "@context": portableActorContext,
937
938
  id: `ap+ef61://did:key:${portableDidMethod}/actor`,
938
939
  type: "UnknownActorType",
939
940
  inbox: "https://gateway.example/users/alice/inbox",
940
- outbox: "https://gateway.example/users/alice/outbox"
941
+ outbox: "https://gateway.example/users/alice/outbox",
942
+ gateways: ["https://gateway.example"]
941
943
  }, {
942
944
  "@context": portableContext,
943
945
  id: `ap://did:key:${portableDidMethod}/activities/1`,
@@ -950,6 +952,137 @@ test("verifyPortableObjectProof()", async (t) => {
950
952
  assertEquals(result.keys.length, 1);
951
953
  }
952
954
  });
955
+ await t.step("requires portable actors to have valid gateways", async () => {
956
+ const actorIds = [
957
+ `ap://did:key:${portableDidMethod}/actor`,
958
+ `ap+ef61://did%3Akey%3A${portableDidMethod}/actor`,
959
+ `https://gateway.example/.well-known/apgateway/did:key:${portableDidMethod}/actor`
960
+ ];
961
+ const actor = (id, extra) => ({
962
+ "@context": portableActorContext,
963
+ id,
964
+ type: "Person",
965
+ inbox: `${id}/inbox`,
966
+ outbox: `${id}/outbox`,
967
+ ...extra
968
+ });
969
+ const validGateways = [
970
+ ["https://gateway.example"],
971
+ ["https://gateway.example/"],
972
+ ["https://gateway.example", "http://other.example:8080"]
973
+ ];
974
+ const invalidGateways = [
975
+ {},
976
+ { gateways: [] },
977
+ { gateways: ["https://gateway.example/path"] },
978
+ { gateways: ["https://gateway.example/?query"] },
979
+ { gateways: ["https://gateway.example/#fragment"] },
980
+ { gateways: ["ftp://gateway.example"] },
981
+ { gateways: ["https://user:password@gateway.example"] },
982
+ { gateways: ["gateway.example"] },
983
+ { gateways: ["https://gateway.example", "https://other.example/path"] }
984
+ ];
985
+ for (const id of actorIds) {
986
+ for (const gateways of validGateways) assert((await verifyPortableObjectProof(await signPortableJsonLd(actor(id, { gateways })), options)).verified, `${id} with ${gateways}`);
987
+ for (const extra of invalidGateways) assertEquals(await verifyPortableObjectProof(await signPortableJsonLd(actor(id, extra)), options), {
988
+ verified: false,
989
+ reason: { type: "invalidGateways" }
990
+ }, `${id} with ${JSON.stringify(extra)}`);
991
+ }
992
+ });
993
+ await t.step("reads gateways in any JSON-LD form", async () => {
994
+ const id = `ap://did:key:${portableDidMethod}/actor`;
995
+ const property = "https://w3id.org/fep/ef61/gateways";
996
+ const documents = [
997
+ {
998
+ "@context": portableContext,
999
+ [property]: { "@list": [{ "@id": "https://gateway.example" }] }
1000
+ },
1001
+ {
1002
+ "@context": portableContext,
1003
+ [property]: "https://gateway.example"
1004
+ },
1005
+ {
1006
+ "@context": [...portableContext, { relays: {
1007
+ "@id": property,
1008
+ "@type": "@id",
1009
+ "@container": "@list"
1010
+ } }],
1011
+ relays: ["https://gateway.example"]
1012
+ }
1013
+ ];
1014
+ for (const document of documents) assert((await verifyPortableObjectProof(await signPortableJsonLd({
1015
+ ...document,
1016
+ id,
1017
+ type: "Person",
1018
+ inbox: `${id}/inbox`,
1019
+ outbox: `${id}/outbox`
1020
+ }), options)).verified, JSON.stringify(document));
1021
+ assertEquals(await verifyPortableObjectProof(await signPortableJsonLd({
1022
+ "@context": portableContext,
1023
+ id,
1024
+ type: "Person",
1025
+ inbox: `${id}/inbox`,
1026
+ outbox: `${id}/outbox`,
1027
+ [property]: [{ "@list": [{ "@id": "https://gateway.example" }] }, { "@list": [{ "@id": "https://other.example" }] }]
1028
+ }), options), {
1029
+ verified: false,
1030
+ reason: { type: "invalidGateways" }
1031
+ });
1032
+ });
1033
+ await t.step("checks gateways only for FEP-2277 actors", async () => {
1034
+ assert((await verifyPortableObjectProof(await signPortableJsonLd({
1035
+ "@context": portableContext,
1036
+ id: `ap://did:key:${portableDidMethod}/actor`,
1037
+ type: "Person",
1038
+ inbox: `ap://did:key:${portableDidMethod}/actor/inbox`
1039
+ }), options)).verified);
1040
+ assert((await verifyPortableObjectProof(await signPortableJsonLd(unsignedObject), options)).verified);
1041
+ });
1042
+ await t.step("checks gateways after the proof shape and before the keys", async () => {
1043
+ const id = `ap://did:key:${portableDidMethod}/actor`;
1044
+ const document = {
1045
+ "@context": portableActorContext,
1046
+ id,
1047
+ type: "Person",
1048
+ inbox: `${id}/inbox`,
1049
+ outbox: `${id}/outbox`
1050
+ };
1051
+ assertEquals(await verifyPortableObjectProof(document, options), {
1052
+ verified: false,
1053
+ reason: { type: "missingProof" }
1054
+ });
1055
+ const keyIds = [];
1056
+ const keyCache = {
1057
+ get(keyId) {
1058
+ keyIds.push(keyId.href);
1059
+ return Promise.resolve(void 0);
1060
+ },
1061
+ set(keyId) {
1062
+ keyIds.push(keyId.href);
1063
+ return Promise.resolve();
1064
+ }
1065
+ };
1066
+ assertEquals(await verifyPortableObjectProof({
1067
+ ...await signPortableJsonLd(document),
1068
+ name: "Tampered"
1069
+ }, {
1070
+ ...options,
1071
+ keyCache
1072
+ }), {
1073
+ verified: false,
1074
+ reason: { type: "invalidGateways" }
1075
+ });
1076
+ assertEquals(keyIds, []);
1077
+ assert((await verifyPortableObjectProof(await signPortableJsonLd({
1078
+ ...document,
1079
+ gateways: ["https://gateway.example"]
1080
+ }), {
1081
+ ...options,
1082
+ keyCache
1083
+ })).verified);
1084
+ assert(keyIds.length > 0);
1085
+ });
953
1086
  await t.step("uses the normative FEP-2277 precedence order", async () => {
954
1087
  for (const document of [{
955
1088
  "@context": portableContext,
@@ -1067,11 +1200,12 @@ test("verifyPortableObjectProof()", async (t) => {
1067
1200
  await t.step("treats compatible identifiers as portable IDs", async () => {
1068
1201
  const compatibleActorId = `https://gateway.example/.well-known/apgateway/did:key:${portableDidMethod}/actor`;
1069
1202
  const actor = {
1070
- "@context": portableContext,
1203
+ "@context": portableActorContext,
1071
1204
  id: compatibleActorId,
1072
1205
  type: "Person",
1073
1206
  inbox: `${compatibleActorId}/inbox`,
1074
- outbox: `${compatibleActorId}/outbox`
1207
+ outbox: `${compatibleActorId}/outbox`,
1208
+ gateways: ["https://gateway.example"]
1075
1209
  };
1076
1210
  const signed = await signPortableJsonLd(actor);
1077
1211
  const result = await verifyPortableObjectProof(signed, options);
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { c as getNormalizationContextLoader } from "./ld-oQj6j_hP.mjs";
4
+ import { c as getNormalizationContextLoader } from "./ld-C15yzuY6.mjs";
5
5
  import jsonld from "@fedify/vocab-runtime/jsonld";
6
6
  //#region src/federation/temporal.ts
7
7
  function isPlainObject(value) {
@@ -6,7 +6,7 @@ import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as ManualClockKvStore } from "../kv-DBRWVx3Q.mjs";
7
7
  import { n as baseOptions, o as stringSchema, t as MockQueue } from "../tasks-IG3pHfvZ.mjs";
8
8
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
9
- import { o as createFederation } from "../middleware-Bdu2-OPD.mjs";
9
+ import { o as createFederation } from "../middleware-BqqycC0P.mjs";
10
10
  //#region src/testing/kv.test.ts
11
11
  test("ManualClockKvStore keeps an entry at its exact expiration instant", async () => {
12
12
  const kv = new ManualClockKvStore();
@@ -5,9 +5,9 @@ import { t as esm_default } from "../esm-BHXXx4Wx.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
6
6
  import "../std__assert-DvMDRPes.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
8
- import { f as verifyRequest } from "../http-Y1ObT1A8.mjs";
8
+ import { f as verifyRequest } from "../http-DQf9Mw4V.mjs";
9
9
  import { i as rsaPrivateKey2 } from "../keys-DIJNHW-Y.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "../docloader-u6zzOExF.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DpWYYY6a.mjs";
11
11
  import { configure, reset } from "@logtape/logtape";
12
12
  import { mockDocumentLoader, test } from "@fedify/fixture";
13
13
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as kvCache, t as MockKvStore } from "../kv-cache-C8YjNAi_.mjs";
4
+ import { n as kvCache, t as MockKvStore } from "../kv-cache-OFBvrKh3.mjs";
5
5
  import { deepStrictEqual, throws } from "node:assert";
6
6
  import { createTestMeterProvider, mockDocumentLoader, test } from "@fedify/fixture";
7
7
  import { preloadedContexts } from "@fedify/vocab-runtime";
@@ -1,5 +1,5 @@
1
1
  const { URLPattern } = require("urlpattern-polyfill");
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_kv_cache = require("../kv-cache-DUXluAc0.cjs");
3
+ const require_kv_cache = require("../kv-cache-1hafSoqH.cjs");
4
4
  exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
5
5
  exports.kvCache = require_kv_cache.kvCache;
package/dist/utils/mod.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-C02XitwK.js";
3
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-DduYhpee.js";
4
4
  export { getAuthenticatedDocumentLoader, kvCache };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "2.4.0-dev.2190+be3a8be0",
3
+ "version": "2.4.0-dev.2193+402149b5",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -151,10 +151,10 @@
151
151
  "structured-field-values": "^2.0.4",
152
152
  "temporal-polyfill": "^1.0.1",
153
153
  "urlpattern-polyfill": "^10.1.0",
154
- "@fedify/uri-template": "2.4.0-dev.2190+be3a8be0",
155
- "@fedify/vocab-runtime": "2.4.0-dev.2190+be3a8be0",
156
- "@fedify/vocab": "2.4.0-dev.2190+be3a8be0",
157
- "@fedify/webfinger": "2.4.0-dev.2190+be3a8be0"
154
+ "@fedify/uri-template": "2.4.0-dev.2193+402149b5",
155
+ "@fedify/vocab": "2.4.0-dev.2193+402149b5",
156
+ "@fedify/vocab-runtime": "2.4.0-dev.2193+402149b5",
157
+ "@fedify/webfinger": "2.4.0-dev.2193+402149b5"
158
158
  },
159
159
  "devDependencies": {
160
160
  "@std/assert": "npm:@jsr/std__assert@^0.226.0",
@@ -167,7 +167,7 @@
167
167
  "typescript": "^6.0.0",
168
168
  "wrangler": "^4.17.0",
169
169
  "@fedify/fixture": "2.0.0",
170
- "@fedify/vocab-tools": "^2.4.0-dev.2190+be3a8be0"
170
+ "@fedify/vocab-tools": "^2.4.0-dev.2193+402149b5"
171
171
  },
172
172
  "scripts": {
173
173
  "build:self": "tsdown",