@rathnasgala2/schemas 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +39 -42
  2. package/THIRD_PARTY_LICENSES.json +1 -1
  3. package/diagnostics/diagnostic-map.json +557 -7
  4. package/docs/catalogs/app-components.json +435 -1
  5. package/docs/catalogs/app-routes.json +152 -2
  6. package/docs/catalogs/schema-inventory.json +15 -5
  7. package/examples/valid/artifact-manifest/rules.json +2 -2
  8. package/examples/valid/build-input/rules.json +341 -1
  9. package/examples/valid/build-provenance/rules.json +2 -2
  10. package/examples/valid/interactions-config/canonical.json +18 -0
  11. package/examples/valid/interactions-config/rules.json +529 -0
  12. package/fixtures/boundary/artifact-manifest/rules.json +2 -2
  13. package/fixtures/boundary/build-input/rules.json +408 -9
  14. package/fixtures/boundary/build-provenance/rules.json +2 -2
  15. package/fixtures/boundary/interactions-config/root.json +18 -0
  16. package/fixtures/boundary/interactions-config/rules.json +725 -0
  17. package/fixtures/invalid/artifact-manifest/SCHEMA_CONSTANT_INVALID/cases.json +0 -11
  18. package/fixtures/invalid/artifact-manifest/SCHEMA_TYPE_INVALID/cases.json +11 -0
  19. package/fixtures/invalid/build-input/GRAPHEME_LENGTH_INVALID/cases.json +11 -0
  20. package/fixtures/invalid/build-input/HTTPS_URL_INVALID/cases.json +29 -0
  21. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +141 -0
  22. package/fixtures/invalid/build-input/SCHEMA_ARRAY_TOO_LONG/cases.json +15 -0
  23. package/fixtures/invalid/build-input/SCHEMA_CONSTANT_INVALID/cases.json +20 -0
  24. package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +11 -0
  25. package/fixtures/invalid/build-input/SCHEMA_NEGATED_RULE_MATCHED/cases.json +9 -0
  26. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_LARGE/cases.json +22 -0
  27. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_SMALL/cases.json +22 -0
  28. package/fixtures/invalid/build-input/SCHEMA_OBJECT_TOO_LARGE/cases.json +0 -15
  29. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +9 -0
  30. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +379 -0
  31. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +190 -0
  32. package/fixtures/invalid/build-input/SCHEMA_VERSION_UNSUPPORTED/cases.json +22 -0
  33. package/fixtures/invalid/build-provenance/SCHEMA_CONSTANT_INVALID/cases.json +0 -11
  34. package/fixtures/invalid/build-provenance/SCHEMA_TYPE_INVALID/cases.json +11 -0
  35. package/fixtures/invalid/interactions-config/BCP47_INVALID/cases.json +58 -0
  36. package/fixtures/invalid/interactions-config/CANONICAL_ROUTE_INVALID/cases.json +38 -0
  37. package/fixtures/invalid/interactions-config/DIGEST_INVALID/cases.json +20 -0
  38. package/fixtures/invalid/interactions-config/EXTENSION_KEY_INVALID/cases.json +20 -0
  39. package/fixtures/invalid/interactions-config/GIT_OBJECT_ID_INVALID/cases.json +20 -0
  40. package/fixtures/invalid/interactions-config/GRAPHEME_LENGTH_INVALID/cases.json +13 -0
  41. package/fixtures/invalid/interactions-config/HTTPS_URL_INVALID/cases.json +29 -0
  42. package/fixtures/invalid/interactions-config/ISO_COUNTRY_INVALID/cases.json +20 -0
  43. package/fixtures/invalid/interactions-config/PACKAGE_EXACT_INVALID/cases.json +38 -0
  44. package/fixtures/invalid/interactions-config/PACKAGE_RANGE_INVALID/cases.json +38 -0
  45. package/fixtures/invalid/interactions-config/PASSIVE_VISUAL_TOKEN_INVALID/cases.json +11 -0
  46. package/fixtures/invalid/interactions-config/PLAIN_LABEL_INVALID/cases.json +31 -0
  47. package/fixtures/invalid/interactions-config/PLAIN_TEXT_INVALID/cases.json +20 -0
  48. package/fixtures/invalid/interactions-config/REPOSITORY_GLOB_INVALID/cases.json +49 -0
  49. package/fixtures/invalid/interactions-config/REPOSITORY_PATH_INVALID/cases.json +62 -0
  50. package/fixtures/invalid/interactions-config/REQUEST_FIELD_UNKNOWN/cases.json +108 -0
  51. package/fixtures/invalid/interactions-config/RFC3339_INVALID/cases.json +29 -0
  52. package/fixtures/invalid/interactions-config/SCHEMA_ARRAY_TOO_LONG/cases.json +17 -0
  53. package/fixtures/invalid/interactions-config/SCHEMA_CONSTANT_INVALID/cases.json +22 -0
  54. package/fixtures/invalid/interactions-config/SCHEMA_ENUM_INVALID/cases.json +13 -0
  55. package/fixtures/invalid/interactions-config/SCHEMA_NEGATED_RULE_MATCHED/cases.json +11 -0
  56. package/fixtures/invalid/interactions-config/SCHEMA_NUMBER_TOO_LARGE/cases.json +24 -0
  57. package/fixtures/invalid/interactions-config/SCHEMA_NUMBER_TOO_SMALL/cases.json +24 -0
  58. package/fixtures/invalid/interactions-config/SCHEMA_PATTERN_INVALID/cases.json +11 -0
  59. package/fixtures/invalid/interactions-config/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +305 -0
  60. package/fixtures/invalid/interactions-config/SCHEMA_TYPE_INVALID/cases.json +175 -0
  61. package/fixtures/invalid/interactions-config/SCHEMA_VERSION_UNSUPPORTED/cases.json +20 -0
  62. package/fixtures/invalid/interactions-config/SEMVER_INVALID/cases.json +20 -0
  63. package/fixtures/invalid/interactions-config/SEMVER_RANGE_INVALID/cases.json +38 -0
  64. package/fixtures/invalid/interactions-config/SLUG_INVALID/cases.json +38 -0
  65. package/fixtures/invalid/interactions-config/STABLE_ID_INVALID/cases.json +20 -0
  66. package/fixtures/invalid/interactions-config/URN_INVALID/cases.json +38 -0
  67. package/fixtures/manifest.json +4287 -26
  68. package/fixtures/s2/empty-modules-placements.json +233 -3
  69. package/fixtures/s2/manifest.json +1 -0
  70. package/fixtures/unknown-field/artifact-manifest/rules.json +1 -1
  71. package/fixtures/unknown-field/build-input/rules.json +198 -1
  72. package/fixtures/unknown-field/build-provenance/rules.json +1 -1
  73. package/fixtures/unknown-field/interactions-config/root.json +19 -0
  74. package/fixtures/unknown-field/interactions-config/rules.json +227 -0
  75. package/generated/browser/validator-core.mjs +4 -3
  76. package/generated/typescript/contracts/artifact-manifest.d.ts +1 -1
  77. package/generated/typescript/contracts/build-input.d.ts +58 -1
  78. package/generated/typescript/contracts/build-provenance.d.ts +1 -1
  79. package/generated/typescript/contracts/interactions-config.d.ts +91 -0
  80. package/generated/typescript/index.d.ts +4 -0
  81. package/generated/typescript/index.js +14 -0
  82. package/openapi/http-catalog.json +230 -2
  83. package/openapi/openapi.yaml +5941 -1509
  84. package/package.json +2 -1
  85. package/sbom.cdx.json +23 -23
  86. package/schemas/artifact-manifest.schema.json +1 -1
  87. package/schemas/build-input.schema.json +117 -2
  88. package/schemas/build-provenance.schema.json +1 -1
  89. package/schemas/interactions-config.schema.json +222 -0
  90. package/src/internal/schema-validator.js +3 -0
@@ -250,7 +250,7 @@ export type ArtifactManifestManifestReproducibleBuildRecord = Readonly<{
250
250
 
251
251
  export type ArtifactManifestManifestRoute = Readonly<{
252
252
  readonly byteLength: ArtifactManifestNonNegativeInt64;
253
- readonly interactionBearing: false;
253
+ readonly interactionBearing: boolean;
254
254
  readonly mediaType:
255
255
  | 'text/html; charset=utf-8'
256
256
  | 'text/css; charset=utf-8'
@@ -153,6 +153,26 @@ export type BuildInputGithubPositiveDecimal = string;
153
153
 
154
154
  export type BuildInputGlob = string;
155
155
 
156
+ export type BuildInputInteractionsConfig = Readonly<{
157
+ readonly comments: Readonly<{
158
+ readonly allowReplies: boolean;
159
+ readonly enabled: boolean;
160
+ readonly maxDepth: number;
161
+ }>;
162
+ readonly publicCounts: Readonly<{
163
+ readonly comments: boolean;
164
+ readonly reactions: boolean;
165
+ }>;
166
+ readonly reactions: Readonly<{
167
+ readonly definitions: ReadonlyArray<BuildInputReactionDefinition>;
168
+ readonly enabled: boolean;
169
+ }>;
170
+ readonly schemaId: 'urn:gala:schema:interactions-config:2.0.0';
171
+ readonly schemaVersion: '2.0.0';
172
+ }>;
173
+
174
+ export type BuildInputInteractionsServiceOrigin = string;
175
+
156
176
  export type BuildInputIsoCountry = string;
157
177
 
158
178
  export type BuildInputLocalizedAuthor = Readonly<{
@@ -167,7 +187,13 @@ export type BuildInputManifestRenderPolicyIdentity = Readonly<{
167
187
  readonly version: BuildInputSemver;
168
188
  }>;
169
189
 
170
- export type BuildInputModuleBuildSelection = Readonly<Record<string, never>>;
190
+ export type BuildInputModuleBuildSelection = Readonly<{
191
+ readonly interactions?: Readonly<{
192
+ readonly apiOrigin: BuildInputInteractionsServiceOrigin;
193
+ readonly appOrigin: BuildInputInteractionsServiceOrigin;
194
+ readonly config: BuildInputInteractionsConfig;
195
+ }>;
196
+ }>;
171
197
 
172
198
  export type BuildInputNavigationItem = Readonly<{
173
199
  readonly children: ReadonlyArray<BuildInputNavigationLeaf>;
@@ -257,6 +283,37 @@ export type BuildInputPublicationNormalized = Readonly<{
257
283
  readonly title: BuildInputPlainText;
258
284
  }>;
259
285
 
286
+ export type BuildInputReactionDefinition = Readonly<{
287
+ readonly enabled: boolean;
288
+ readonly key: BuildInputReactionKey;
289
+ readonly label: BuildInputPlainLabel & string;
290
+ readonly order: number;
291
+ readonly visual: BuildInputReactionVisual;
292
+ }>;
293
+
294
+ export type BuildInputReactionKey = string;
295
+
296
+ export type BuildInputReactionVisual = Readonly<{
297
+ readonly kind: 'emoji';
298
+ readonly token:
299
+ | '👍'
300
+ | '❤️'
301
+ | '💡'
302
+ | '🎉'
303
+ | '😂'
304
+ | '🤯'
305
+ | '🙏'
306
+ | '🔥'
307
+ | '👏'
308
+ | '😮'
309
+ | '😢'
310
+ | '🤔'
311
+ | '✨'
312
+ | '🚀'
313
+ | '💯'
314
+ | '👀';
315
+ }>;
316
+
260
317
  export type BuildInputRenderableBody = Readonly<{
261
318
  readonly body: string;
262
319
  readonly bodyDigest: BuildInputDigest;
@@ -250,7 +250,7 @@ export type BuildProvenanceManifestReproducibleBuildRecord = Readonly<{
250
250
 
251
251
  export type BuildProvenanceManifestRoute = Readonly<{
252
252
  readonly byteLength: BuildProvenanceNonNegativeInt64;
253
- readonly interactionBearing: false;
253
+ readonly interactionBearing: boolean;
254
254
  readonly mediaType:
255
255
  | 'text/html; charset=utf-8'
256
256
  | 'text/css; charset=utf-8'
@@ -0,0 +1,91 @@
1
+ // Generated from urn:gala:schema:interactions-config:2.0.0; sourceDesignRevision=a53052955ceb6c1aa10c886289dc832eedfe6de0a00004df07d353ac19c4403a.
2
+ // Do not edit.
3
+
4
+ export type InteractionsConfigBcp47 = string;
5
+
6
+ export type InteractionsConfigCanonicalRoute = string;
7
+
8
+ export type InteractionsConfigDigest = string;
9
+
10
+ export type InteractionsConfigExtensionKey = string;
11
+
12
+ export type InteractionsConfigGitObjectId = string;
13
+
14
+ export type InteractionsConfigGlob = string;
15
+
16
+ export type InteractionsConfigIsoCountry = string;
17
+
18
+ export type InteractionsConfigPackageExact = string;
19
+
20
+ export type InteractionsConfigPackageRange = string;
21
+
22
+ export type InteractionsConfigPassiveVisualToken = never;
23
+
24
+ export type InteractionsConfigPlainLabel = string;
25
+
26
+ export type InteractionsConfigPlainText = string;
27
+
28
+ export type InteractionsConfigReactionDefinition = Readonly<{
29
+ readonly enabled: boolean;
30
+ readonly key: InteractionsConfigReactionKey;
31
+ readonly label: InteractionsConfigPlainLabel & string;
32
+ readonly order: number;
33
+ readonly visual: InteractionsConfigReactionVisual;
34
+ }>;
35
+
36
+ export type InteractionsConfigReactionKey = string;
37
+
38
+ export type InteractionsConfigReactionVisual = Readonly<{
39
+ readonly kind: 'emoji';
40
+ readonly token:
41
+ | '👍'
42
+ | '❤️'
43
+ | '💡'
44
+ | '🎉'
45
+ | '😂'
46
+ | '🤯'
47
+ | '🙏'
48
+ | '🔥'
49
+ | '👏'
50
+ | '😮'
51
+ | '😢'
52
+ | '🤔'
53
+ | '✨'
54
+ | '🚀'
55
+ | '💯'
56
+ | '👀';
57
+ }>;
58
+
59
+ export type InteractionsConfigRepoRelativePath = string;
60
+
61
+ export type InteractionsConfigRfc3339 = string;
62
+
63
+ export type InteractionsConfigSemver = string;
64
+
65
+ export type InteractionsConfigSemverRange = string;
66
+
67
+ export type InteractionsConfigSlug = string;
68
+
69
+ export type InteractionsConfigStableId = string;
70
+
71
+ export type InteractionsConfigUrlHttps = string;
72
+
73
+ export type InteractionsConfigUrn = string;
74
+
75
+ export type InteractionsConfigDocument = Readonly<{
76
+ readonly comments: Readonly<{
77
+ readonly allowReplies: boolean;
78
+ readonly enabled: boolean;
79
+ readonly maxDepth: number;
80
+ }>;
81
+ readonly publicCounts: Readonly<{
82
+ readonly comments: boolean;
83
+ readonly reactions: boolean;
84
+ }>;
85
+ readonly reactions: Readonly<{
86
+ readonly definitions: ReadonlyArray<InteractionsConfigReactionDefinition>;
87
+ readonly enabled: boolean;
88
+ }>;
89
+ readonly schemaId: 'urn:gala:schema:interactions-config:2.0.0';
90
+ readonly schemaVersion: '2.0.0';
91
+ }>;
@@ -58,6 +58,10 @@ export type { EventEnvelopeDocument } from './contracts/event-envelope.js';
58
58
  export declare function isEventEnvelopeDocument(
59
59
  value: unknown,
60
60
  ): value is import('./contracts/event-envelope.js').EventEnvelopeDocument;
61
+ export type { InteractionsConfigDocument } from './contracts/interactions-config.js';
62
+ export declare function isInteractionsConfigDocument(
63
+ value: unknown,
64
+ ): value is import('./contracts/interactions-config.js').InteractionsConfigDocument;
61
65
  export type { LockDocument } from './contracts/lock.js';
62
66
  export declare function isLockDocument(
63
67
  value: unknown,
@@ -15,6 +15,7 @@ const SCHEMA_IDS = [
15
15
  'urn:gala:schema:deployment-observation:2.0.0',
16
16
  'urn:gala:schema:deployment-receipt:2.0.0',
17
17
  'urn:gala:schema:event-envelope:2.0.0',
18
+ 'urn:gala:schema:interactions-config:2.0.0',
18
19
  'urn:gala:schema:lock:2.0.0',
19
20
  'urn:gala:schema:navigation:2.0.0',
20
21
  'urn:gala:schema:problem:2.0.0',
@@ -189,6 +190,19 @@ export function isEventEnvelopeDocument(value) {
189
190
  ).valid;
190
191
  }
191
192
 
193
+ /**
194
+ * Test whether a value is a valid InteractionsConfigDocument.
195
+ *
196
+ * @param {unknown} value candidate document
197
+ * @returns {boolean} validation result
198
+ */
199
+ export function isInteractionsConfigDocument(value) {
200
+ return validateGeneratedDocument(
201
+ 'urn:gala:schema:interactions-config:2.0.0',
202
+ value,
203
+ ).valid;
204
+ }
205
+
192
206
  /**
193
207
  * Test whether a value is a valid LockDocument.
194
208
  *
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "2.0.0",
3
3
  "sourceDesignRevision": "a53052955ceb6c1aa10c886289dc832eedfe6de0a00004df07d353ac19c4403a",
4
- "openApiDigest": "sha256:f3d0acf21a5fe89857d94dfa3067bbb59486a3e3a7f263cdd261695238303290",
4
+ "openApiDigest": "sha256:b926672f6094bd397d63ae05f96eff46a47109e12aeca1761bdb3ee7c3957e5e",
5
5
  "operations": [
6
6
  {
7
7
  "operationId": "getInternalHealth",
@@ -634,6 +634,66 @@
634
634
  "actionGrant": "none",
635
635
  "sourceFragment": "organizations"
636
636
  },
637
+ {
638
+ "operationId": "getOrganizationsByOrganizationIdPublicationsByPublicationIdInteractionAggregates",
639
+ "method": "GET",
640
+ "path": "/v2/organizations/{organizationId}/publications/{publicationId}/interaction-aggregates",
641
+ "purpose": "read exact reaction and comment totals per article",
642
+ "capabilityKey": "publication.view",
643
+ "conditionalCapabilityKeys": [],
644
+ "activationGate": "MVP",
645
+ "assuranceClass": "SESSION",
646
+ "actionGrant": "none",
647
+ "sourceFragment": "moderation"
648
+ },
649
+ {
650
+ "operationId": "getOrganizationsByOrganizationIdPublicationsByPublicationIdInteractionSettings",
651
+ "method": "GET",
652
+ "path": "/v2/organizations/{organizationId}/publications/{publicationId}/interaction-settings",
653
+ "purpose": "read this publication's reader interaction settings at the main branch head",
654
+ "capabilityKey": "publication.view",
655
+ "conditionalCapabilityKeys": [],
656
+ "activationGate": "MVP",
657
+ "assuranceClass": "SESSION",
658
+ "actionGrant": "none",
659
+ "sourceFragment": "interaction-settings"
660
+ },
661
+ {
662
+ "operationId": "putOrganizationsByOrganizationIdPublicationsByPublicationIdInteractionSettings",
663
+ "method": "PUT",
664
+ "path": "/v2/organizations/{organizationId}/publications/{publicationId}/interaction-settings",
665
+ "purpose": "save this publication's reader interaction settings as a repository change",
666
+ "capabilityKey": "publication.source.write",
667
+ "conditionalCapabilityKeys": [],
668
+ "activationGate": "MVP",
669
+ "assuranceClass": "SESSION",
670
+ "actionGrant": "none",
671
+ "sourceFragment": "interaction-settings"
672
+ },
673
+ {
674
+ "operationId": "postOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecide",
675
+ "method": "POST",
676
+ "path": "/v2/organizations/{organizationId}/publications/{publicationId}/moderation/comments/{commentId}:decide",
677
+ "purpose": "record a moderation decision on one comment",
678
+ "capabilityKey": "publication.moderate",
679
+ "conditionalCapabilityKeys": [],
680
+ "activationGate": "MVP",
681
+ "assuranceClass": "SESSION",
682
+ "actionGrant": "none",
683
+ "sourceFragment": "moderation"
684
+ },
685
+ {
686
+ "operationId": "getOrganizationsByOrganizationIdPublicationsByPublicationIdModerationQueue",
687
+ "method": "GET",
688
+ "path": "/v2/organizations/{organizationId}/publications/{publicationId}/moderation/queue",
689
+ "purpose": "list comments awaiting or carrying a moderation outcome",
690
+ "capabilityKey": "publication.moderate",
691
+ "conditionalCapabilityKeys": [],
692
+ "activationGate": "MVP",
693
+ "assuranceClass": "SESSION",
694
+ "actionGrant": "none",
695
+ "sourceFragment": "moderation"
696
+ },
637
697
  {
638
698
  "operationId": "postOrganizationsByOrganizationIdPublicationsByPublicationIdPublishes",
639
699
  "method": "POST",
@@ -884,6 +944,150 @@
884
944
  "actionGrant": "none",
885
945
  "sourceFragment": "organizations"
886
946
  },
947
+ {
948
+ "operationId": "deletePublicCommentsByCommentId",
949
+ "method": "DELETE",
950
+ "path": "/v2/public/comments/{commentId}",
951
+ "purpose": "delete the reader's own comment",
952
+ "capabilityKey": null,
953
+ "conditionalCapabilityKeys": [],
954
+ "activationGate": "MVP",
955
+ "assuranceClass": "SESSION",
956
+ "actionGrant": "none",
957
+ "sourceFragment": "public-interactions"
958
+ },
959
+ {
960
+ "operationId": "postPublicCommentsByCommentIdReports",
961
+ "method": "POST",
962
+ "path": "/v2/public/comments/{commentId}/reports",
963
+ "purpose": "report a comment as the signed-in reader",
964
+ "capabilityKey": null,
965
+ "conditionalCapabilityKeys": [],
966
+ "activationGate": "MVP",
967
+ "assuranceClass": "SESSION",
968
+ "actionGrant": "none",
969
+ "sourceFragment": "public-interactions"
970
+ },
971
+ {
972
+ "operationId": "postPublicCommentsByCommentIdRevisions",
973
+ "method": "POST",
974
+ "path": "/v2/public/comments/{commentId}/revisions",
975
+ "purpose": "edit the reader's own comment inside the edit window",
976
+ "capabilityKey": null,
977
+ "conditionalCapabilityKeys": [],
978
+ "activationGate": "MVP",
979
+ "assuranceClass": "SESSION",
980
+ "actionGrant": "none",
981
+ "sourceFragment": "public-interactions"
982
+ },
983
+ {
984
+ "operationId": "getPublicPublicationsByPublicationId",
985
+ "method": "GET",
986
+ "path": "/v2/public/publications/{publicationId}",
987
+ "purpose": "read the public identity of a live publication",
988
+ "capabilityKey": null,
989
+ "conditionalCapabilityKeys": [],
990
+ "activationGate": "MVP",
991
+ "assuranceClass": "SESSION",
992
+ "actionGrant": "none",
993
+ "sourceFragment": "public-interactions"
994
+ },
995
+ {
996
+ "operationId": "getPublicPublicationsByPublicationIdContentsByContentIdComments",
997
+ "method": "GET",
998
+ "path": "/v2/public/publications/{publicationId}/contents/{contentId}/comments",
999
+ "purpose": "list the visible comments of one article",
1000
+ "capabilityKey": null,
1001
+ "conditionalCapabilityKeys": [],
1002
+ "activationGate": "MVP",
1003
+ "assuranceClass": "SESSION",
1004
+ "actionGrant": "none",
1005
+ "sourceFragment": "public-interactions"
1006
+ },
1007
+ {
1008
+ "operationId": "postPublicPublicationsByPublicationIdContentsByContentIdComments",
1009
+ "method": "POST",
1010
+ "path": "/v2/public/publications/{publicationId}/contents/{contentId}/comments",
1011
+ "purpose": "post a comment or a reply as the signed-in reader",
1012
+ "capabilityKey": null,
1013
+ "conditionalCapabilityKeys": [],
1014
+ "activationGate": "MVP",
1015
+ "assuranceClass": "SESSION",
1016
+ "actionGrant": "none",
1017
+ "sourceFragment": "public-interactions"
1018
+ },
1019
+ {
1020
+ "operationId": "getPublicPublicationsByPublicationIdContentsByContentIdInteractions",
1021
+ "method": "GET",
1022
+ "path": "/v2/public/publications/{publicationId}/contents/{contentId}/interactions",
1023
+ "purpose": "read the effective reader interactions and counts of one article",
1024
+ "capabilityKey": null,
1025
+ "conditionalCapabilityKeys": [],
1026
+ "activationGate": "MVP",
1027
+ "assuranceClass": "SESSION",
1028
+ "actionGrant": "none",
1029
+ "sourceFragment": "public-interactions"
1030
+ },
1031
+ {
1032
+ "operationId": "deletePublicPublicationsByPublicationIdContentsByContentIdReactionsByReactionKey",
1033
+ "method": "DELETE",
1034
+ "path": "/v2/public/publications/{publicationId}/contents/{contentId}/reactions/{reactionKey}",
1035
+ "purpose": "clear the signed-in reader's reaction on one article",
1036
+ "capabilityKey": null,
1037
+ "conditionalCapabilityKeys": [],
1038
+ "activationGate": "MVP",
1039
+ "assuranceClass": "SESSION",
1040
+ "actionGrant": "none",
1041
+ "sourceFragment": "public-interactions"
1042
+ },
1043
+ {
1044
+ "operationId": "putPublicPublicationsByPublicationIdContentsByContentIdReactionsByReactionKey",
1045
+ "method": "PUT",
1046
+ "path": "/v2/public/publications/{publicationId}/contents/{contentId}/reactions/{reactionKey}",
1047
+ "purpose": "set the signed-in reader's reaction on one article",
1048
+ "capabilityKey": null,
1049
+ "conditionalCapabilityKeys": [],
1050
+ "activationGate": "MVP",
1051
+ "assuranceClass": "SESSION",
1052
+ "actionGrant": "none",
1053
+ "sourceFragment": "public-interactions"
1054
+ },
1055
+ {
1056
+ "operationId": "postReaderAuthorizations",
1057
+ "method": "POST",
1058
+ "path": "/v2/reader/authorizations",
1059
+ "purpose": "authorize a visiting reader for one publication and return the redirect",
1060
+ "capabilityKey": null,
1061
+ "conditionalCapabilityKeys": [],
1062
+ "activationGate": "MVP",
1063
+ "assuranceClass": "SESSION",
1064
+ "actionGrant": "none",
1065
+ "sourceFragment": "reader"
1066
+ },
1067
+ {
1068
+ "operationId": "postReaderTokens",
1069
+ "method": "POST",
1070
+ "path": "/v2/reader/tokens",
1071
+ "purpose": "exchange a one-time authorization code for a publication-scoped reader token",
1072
+ "capabilityKey": null,
1073
+ "conditionalCapabilityKeys": [],
1074
+ "activationGate": "MVP",
1075
+ "assuranceClass": "SESSION",
1076
+ "actionGrant": "none",
1077
+ "sourceFragment": "reader"
1078
+ },
1079
+ {
1080
+ "operationId": "deleteReaderTokensCurrent",
1081
+ "method": "DELETE",
1082
+ "path": "/v2/reader/tokens/current",
1083
+ "purpose": "revoke the reader token that made the request",
1084
+ "capabilityKey": null,
1085
+ "conditionalCapabilityKeys": [],
1086
+ "activationGate": "MVP",
1087
+ "assuranceClass": "SESSION",
1088
+ "actionGrant": "none",
1089
+ "sourceFragment": "reader"
1090
+ },
887
1091
  {
888
1092
  "operationId": "getSelfAuthenticators",
889
1093
  "method": "GET",
@@ -1016,6 +1220,30 @@
1016
1220
  "actionGrant": "none",
1017
1221
  "sourceFragment": "self"
1018
1222
  },
1223
+ {
1224
+ "operationId": "getSelfReaderConnections",
1225
+ "method": "GET",
1226
+ "path": "/v2/self/reader-connections",
1227
+ "purpose": "list the publications this person is connected to as a reader",
1228
+ "capabilityKey": null,
1229
+ "conditionalCapabilityKeys": [],
1230
+ "activationGate": "MVP",
1231
+ "assuranceClass": "SESSION",
1232
+ "actionGrant": "none",
1233
+ "sourceFragment": "self"
1234
+ },
1235
+ {
1236
+ "operationId": "deleteSelfReaderConnectionsByPublicationId",
1237
+ "method": "DELETE",
1238
+ "path": "/v2/self/reader-connections/{publicationId}",
1239
+ "purpose": "revoke every reader token this person holds for one publication",
1240
+ "capabilityKey": null,
1241
+ "conditionalCapabilityKeys": [],
1242
+ "activationGate": "MVP",
1243
+ "assuranceClass": "SESSION",
1244
+ "actionGrant": "none",
1245
+ "sourceFragment": "self"
1246
+ },
1019
1247
  {
1020
1248
  "operationId": "postSelfRecoveryCodeSets",
1021
1249
  "method": "POST",
@@ -1113,5 +1341,5 @@
1113
1341
  "sourceFragment": "workloads"
1114
1342
  }
1115
1343
  ],
1116
- "digest": "sha256:60cc9daaec10eda1f7fdfa827b76a337be99ab1b8498b0205dfc0a10a683b87c"
1344
+ "digest": "sha256:ea81649bfded3f08fa1b7cbe4de25d76c2becfc5899daa2e807b7d8a4870fa25"
1117
1345
  }