@anthusai/papyrus 2.0.0-next.9 → 2.0.0-next.90

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 (217) hide show
  1. package/amplify/auth/resource.js +16 -1
  2. package/amplify/auth/resource.ts +19 -1
  3. package/amplify/data/function-handler.js +20 -0
  4. package/amplify/data/function-handler.ts +40 -0
  5. package/amplify/data/resource.js +151 -61
  6. package/amplify/data/resource.ts +157 -61
  7. package/amplify/data/schema.js +2096 -1980
  8. package/amplify/data/schema.ts +198 -69
  9. package/amplify/functions/assignment-action/data-access.js +2 -0
  10. package/amplify/functions/assignment-action/data-access.ts +2 -0
  11. package/amplify/functions/assignment-action/handler.ts +1 -1
  12. package/amplify/functions/automation-view/handler.py +17 -0
  13. package/amplify/functions/automation-view/resource.js +24 -0
  14. package/amplify/functions/automation-view/resource.ts +34 -0
  15. package/amplify/functions/automation-view/schema.js +26 -0
  16. package/amplify/functions/automation-view/schema.ts +28 -0
  17. package/amplify/functions/automation-view/wire.js +56 -0
  18. package/amplify/functions/automation-view/wire.ts +76 -0
  19. package/amplify/functions/content-actions/handler.py +61 -2
  20. package/amplify/functions/content-actions/requirements.txt +1 -0
  21. package/amplify/functions/content-actions/resource.js +1 -1
  22. package/amplify/functions/content-actions/resource.ts +1 -1
  23. package/amplify/{plugins/editorial-checks/function → functions/editorial-checks}/handler.py +3 -3
  24. package/amplify/functions/editorial-checks/requirements.txt +1 -0
  25. package/amplify/{plugins/editorial-checks/function → functions/editorial-checks}/resource.js +7 -7
  26. package/amplify/{plugins/editorial-checks/function → functions/editorial-checks}/resource.ts +7 -7
  27. package/amplify/functions/editorial-checks/schema.js +122 -0
  28. package/amplify/{plugins → functions}/editorial-checks/schema.ts +40 -12
  29. package/amplify/functions/editorial-checks/wire.js +53 -0
  30. package/amplify/functions/editorial-checks/wire.ts +61 -0
  31. package/amplify/functions/monitoring-view/handler.py +11 -0
  32. package/amplify/functions/monitoring-view/resource.js +24 -0
  33. package/amplify/functions/monitoring-view/resource.ts +34 -0
  34. package/amplify/functions/monitoring-view/schema.js +17 -0
  35. package/amplify/functions/monitoring-view/schema.ts +19 -0
  36. package/amplify/functions/monitoring-view/wire.js +37 -0
  37. package/amplify/functions/monitoring-view/wire.ts +47 -0
  38. package/amplify/functions/public-forms/core.js +247 -0
  39. package/amplify/functions/public-forms/core.ts +310 -0
  40. package/amplify/functions/public-forms/handler.ts +41 -0
  41. package/amplify/functions/public-forms/origins.js +35 -0
  42. package/amplify/functions/public-forms/origins.ts +43 -0
  43. package/amplify/functions/public-forms/resource.js +9 -0
  44. package/amplify/functions/public-forms/resource.ts +10 -0
  45. package/amplify/functions/public-forms/wire.js +25 -0
  46. package/amplify/functions/public-forms/wire.ts +32 -0
  47. package/amplify/functions/shared/editorial-context.ts +63 -4
  48. package/amplify/functions/shared/python-bundle.js +20 -14
  49. package/amplify/functions/shared/python-bundle.ts +25 -18
  50. package/amplify/plugins/newsletter/config.js +245 -0
  51. package/amplify/plugins/newsletter/config.ts +305 -0
  52. package/amplify/plugins/newsletter/function/handler.py +6 -0
  53. package/amplify/plugins/newsletter/function/requirements.txt +5 -0
  54. package/amplify/plugins/newsletter/ops/handler.py +12 -0
  55. package/amplify/plugins/newsletter/ops/resource.js +27 -0
  56. package/amplify/plugins/newsletter/ops/resource.ts +37 -0
  57. package/amplify/plugins/newsletter/papyrus.plugin.js +263 -0
  58. package/amplify/plugins/newsletter/papyrus.plugin.ts +311 -0
  59. package/amplify/plugins/newsletter/schema.js +57 -0
  60. package/amplify/plugins/newsletter/schema.ts +62 -0
  61. package/amplify/plugins/newsletter/secure-string-parameter.js +107 -0
  62. package/amplify/plugins/newsletter/secure-string-parameter.ts +120 -0
  63. package/amplify/plugins/newsletter/sending.js +140 -0
  64. package/amplify/plugins/newsletter/sending.ts +186 -0
  65. package/amplify/plugins/reader-steering/config.js +182 -0
  66. package/amplify/plugins/reader-steering/config.ts +290 -0
  67. package/amplify/plugins/reader-steering/function/ai_moderation.py +246 -0
  68. package/amplify/plugins/reader-steering/function/handler.py +1567 -0
  69. package/amplify/plugins/reader-steering/function/moderation-prompt.md +27 -0
  70. package/amplify/plugins/reader-steering/function/moderation.py +316 -0
  71. package/amplify/plugins/reader-steering/function/proposals.py +458 -0
  72. package/amplify/plugins/reader-steering/function/resource.js +27 -0
  73. package/amplify/plugins/reader-steering/function/resource.ts +35 -0
  74. package/amplify/plugins/reader-steering/papyrus.plugin.js +186 -0
  75. package/amplify/plugins/reader-steering/papyrus.plugin.ts +212 -0
  76. package/amplify/plugins/reader-steering/schema.js +229 -0
  77. package/amplify/plugins/reader-steering/schema.ts +231 -0
  78. package/amplify/plugins/registry.js +4 -2
  79. package/amplify/plugins/registry.ts +4 -2
  80. package/amplify/plugins/signup/schema.js +2 -1
  81. package/amplify/plugins/signup/schema.ts +2 -1
  82. package/amplify/plugins/types.ts +5 -0
  83. package/amplify/plugins/wire.js +1 -0
  84. package/amplify/plugins/wire.ts +1 -0
  85. package/amplify/publication/projection-lease.js +30 -0
  86. package/amplify/publication/projection-lease.ts +39 -0
  87. package/amplify/publication/redirect-and-index.js +105 -0
  88. package/amplify/publication/redirect-rules.js +73 -0
  89. package/amplify/publication/redirect-rules.ts +93 -0
  90. package/amplify/publication/s3-projection.js +7 -1
  91. package/amplify/publication/s3-projection.ts +9 -1
  92. package/amplify/site-backend-config.ts +18 -1
  93. package/amplify/site-backend-names.js +4 -2
  94. package/amplify/site-backend-names.ts +4 -2
  95. package/amplify/site-backend.js +45 -3
  96. package/amplify/site-backend.ts +51 -3
  97. package/app/api/auth/prospectus/sign-in/route.ts +4 -0
  98. package/app/api/newsletter/confirm/route.ts +13 -0
  99. package/app/api/newsletter/preferences/route.ts +13 -0
  100. package/app/api/newsletter/state/route.ts +9 -0
  101. package/app/api/newsletter/subscribe/route.ts +9 -0
  102. package/app/api/newsletter/unsubscribe/route.ts +13 -0
  103. package/app/api/newsroom/curation/context/route.ts +9 -0
  104. package/app/api/newsroom/curation/priming/route.ts +9 -0
  105. package/app/api/newsroom/curation/publication/route.ts +9 -0
  106. package/app/api/reader/comment/delete/route.ts +9 -0
  107. package/app/api/reader/comment/edit/route.ts +9 -0
  108. package/app/api/reader/comment/route.ts +9 -0
  109. package/app/api/reader/flag/route.ts +9 -0
  110. package/app/api/reader/handle/route.ts +9 -0
  111. package/app/api/reader/me/route.ts +9 -0
  112. package/app/api/reader/rating/route.ts +9 -0
  113. package/app/api/reader/report/route.ts +9 -0
  114. package/app/api/reader/retired/route.ts +9 -0
  115. package/app/api/reader/submit/route.ts +9 -0
  116. package/app/api/reader/vote/route.ts +9 -0
  117. package/bin/papyrus-infra.mjs +20 -1
  118. package/components/automation-panel.tsx +49 -0
  119. package/components/automation-run-now.tsx +97 -0
  120. package/components/automation-view.tsx +195 -0
  121. package/components/editorial-checks-admin-panel.tsx +38 -13
  122. package/components/moderation-panel.tsx +248 -0
  123. package/components/monitoring-overview-view.tsx +241 -0
  124. package/components/monitoring-panel.tsx +40 -0
  125. package/components/news-desk-client-provider.tsx +18 -18
  126. package/components/news-desk-taxonomy-client.ts +28 -8
  127. package/components/newsletter-panel.tsx +474 -0
  128. package/components/newsletter-sections.tsx +163 -0
  129. package/components/newsroom-access-gate.tsx +16 -2
  130. package/components/newsroom-article-editor.tsx +11 -11
  131. package/components/newsroom-articles-view.tsx +6 -6
  132. package/components/newsroom-assignment-detail.tsx +6 -6
  133. package/components/newsroom-board-view.tsx +8 -3
  134. package/components/newsroom-curation-bootstrap.tsx +45 -0
  135. package/components/newsroom-ops-overview.tsx +26 -96
  136. package/components/newsroom-ops-shell.tsx +2 -2
  137. package/components/newsroom-organizer.css +33 -0
  138. package/components/newsroom-overview-skeleton.tsx +25 -0
  139. package/components/newsroom-references-view.tsx +192 -49
  140. package/components/notification-center.tsx +277 -0
  141. package/components/publication-cyclotron-panel.tsx +15 -10
  142. package/components/reader-auth-state.ts +1 -1
  143. package/components/reference-add-entry.tsx +75 -0
  144. package/components/reference-curation-controls.tsx +31 -22
  145. package/components/reference-cyclotron-priming.tsx +58 -19
  146. package/components/reference-cyclotron-suggestion.tsx +10 -6
  147. package/components/reference-priming.tsx +14 -10
  148. package/components/reference-relevance-review.tsx +3 -3
  149. package/components/reference-section-suggestion.tsx +1 -1
  150. package/components/topic-steering-workspace.tsx +237 -158
  151. package/components/use-editorial-checks.ts +12 -10
  152. package/infra/amplify-app-shell.js +94 -16
  153. package/infra/amplify-app-shell.ts +106 -18
  154. package/infra/cloud-email-config.js +32 -0
  155. package/infra/cloud-email-config.ts +39 -0
  156. package/infra/cloud-email.js +57 -0
  157. package/infra/cloud-email.test.js +69 -0
  158. package/infra/cloud-email.test.ts +66 -0
  159. package/infra/cloud-email.ts +60 -0
  160. package/infra/index.js +1 -0
  161. package/infra/secure-string-parameter-handler.js +41 -0
  162. package/infra/secure-string-parameter-handler.ts +41 -0
  163. package/infra/secure-string-parameter.js +79 -0
  164. package/infra/secure-string-parameter.ts +91 -0
  165. package/infra/site-config.js +88 -6
  166. package/infra/site-config.ts +134 -6
  167. package/lib/automation-client.ts +54 -0
  168. package/lib/automation-fixture.ts +93 -0
  169. package/lib/automation-overview.ts +252 -0
  170. package/lib/category-repository.ts +14 -12
  171. package/lib/console-web-context.ts +1 -1
  172. package/lib/curation-routes.ts +345 -0
  173. package/lib/cyclotron-suggestions.ts +4 -4
  174. package/lib/editorial-checks-backend.ts +1 -1
  175. package/lib/editorial-checks-client.ts +19 -1
  176. package/lib/editorial-checks-demo.ts +2 -2
  177. package/lib/editorial-checks-settings.ts +3 -0
  178. package/lib/editorial-checks.ts +8 -11
  179. package/lib/editorial-preview.ts +5 -5
  180. package/lib/monitoring-client.ts +29 -0
  181. package/lib/monitoring-overview-fixture.ts +51 -0
  182. package/lib/monitoring-overview.ts +145 -0
  183. package/lib/news-desk-session.ts +12 -21
  184. package/lib/newsletter-api.ts +418 -0
  185. package/lib/newsletter-client.ts +46 -0
  186. package/lib/newsletter-fixture.ts +184 -0
  187. package/lib/newsletter-model.ts +202 -0
  188. package/lib/newsroom-demo-dashboard.ts +1 -1
  189. package/lib/newsroom-nav.ts +1 -1
  190. package/lib/newsroom-organizer-nav.ts +2 -1
  191. package/lib/prospectus-session.ts +15 -14
  192. package/lib/prospectus-sign-in-routes.ts +105 -20
  193. package/lib/prospectus-site-identity.ts +46 -6
  194. package/lib/reader-api.ts +145 -0
  195. package/lib/reader-moderation.ts +220 -0
  196. package/lib/reader-retirement-route.ts +89 -0
  197. package/lib/reader-subject.md +29 -0
  198. package/lib/reader-subject.ts +53 -0
  199. package/lib/reference-review-details.ts +71 -0
  200. package/lib/reference-review-request.ts +14 -0
  201. package/lib/relevance-decisions.ts +42 -10
  202. package/lib/relevance-status.ts +2 -2
  203. package/lib/review-client.ts +117 -0
  204. package/lib/review-fixture.ts +45 -0
  205. package/lib/review-requests.ts +244 -0
  206. package/lib/semantic-graph.ts +2 -0
  207. package/lib/site-brand-tenant.ts +11 -6
  208. package/lib/site-brand.ts +6 -3
  209. package/lib/site-origin.ts +67 -0
  210. package/lib/use-reference-review-data.ts +44 -0
  211. package/middleware.ts +14 -3
  212. package/package.json +56 -3
  213. package/routes.manifest.json +215 -2
  214. package/amplify/plugins/editorial-checks/function/requirements.txt +0 -1
  215. package/amplify/plugins/editorial-checks/papyrus.plugin.js +0 -71
  216. package/amplify/plugins/editorial-checks/papyrus.plugin.ts +0 -87
  217. package/amplify/plugins/editorial-checks/schema.js +0 -94
@@ -1,13 +1,18 @@
1
1
  import { a } from "@aws-amplify/backend";
2
2
  import { assignmentAction } from "../functions/assignment-action/resource.js";
3
3
  import { categoryAction } from "../functions/category-action/resource.js";
4
+ import { editorialChecksSchemaDefinitions } from "../functions/editorial-checks/schema.js";
5
+ import { automationViewSchemaDefinitions } from "../functions/automation-view/schema.js";
6
+ import { monitoringViewSchemaDefinitions } from "../functions/monitoring-view/schema.js";
4
7
  import { contentActions } from "../functions/content-actions/resource.js";
5
8
  import { knowledgeQuery } from "../functions/knowledge-query/resource.js";
6
9
  import { manageUserRole } from "../functions/manage-user-role/resource.js";
7
10
  import { modelAttachmentUpload } from "../functions/model-attachment-upload/resource.js";
8
11
  import { newsroomSummary } from "../functions/newsroom-summary/resource.js";
12
+ import { publicForms } from "../functions/public-forms/resource.js";
9
13
  import { procedureAction } from "../functions/procedure-action/resource.js";
10
14
  import { readerSettings } from "../functions/reader-settings/resource.js";
15
+ import { functionHandler } from "./function-handler.js";
11
16
  const authoringOperations = [
12
17
  "read",
13
18
  "create",
@@ -20,1986 +25,2086 @@ const categoryWriteGroups = ["editor", "admin"];
20
25
  const categoryAppendOnlyOperations = ["read", "create"];
21
26
  const modelWithoutSubscriptions = (fields) => a.model(fields).disableOperations(["subscriptions"]);
22
27
  const realtimeModel = (fields) => a.model(fields);
23
- const baseDefinitions = {
24
- UserProfile: modelWithoutSubscriptions({
25
- id: a.id().required(),
26
- email: a.email(),
27
- displayName: a.string(),
28
- avatarUrl: a.url(),
29
- preferences: a.json(),
30
- settings: a.json(),
31
- status: a.string(),
32
- mergedIntoProfileId: a.id(),
33
- mergedAt: a.datetime(),
34
- mergedBy: a.string(),
35
- mergeReason: a.string(),
36
- createdAt: a.datetime(),
37
- updatedAt: a.datetime(),
38
- })
39
- .authorization((allow) => [
40
- allow.owner(),
41
- allow.group(adminGroup),
42
- ]),
43
- UserIdentity: modelWithoutSubscriptions({
44
- id: a.id().required(),
45
- userProfileId: a.id().required(),
46
- cognitoSub: a.string().required(),
47
- provider: a.string(),
48
- email: a.email(),
49
- status: a.string().required(),
50
- linkedAt: a.datetime().required(),
51
- lastSeenAt: a.datetime(),
52
- })
53
- .secondaryIndexes((index) => [
54
- index("userProfileId").sortKeys(["linkedAt"]).queryField("listUserIdentitiesByProfileAndLinkedAt"),
55
- index("cognitoSub").queryField("userIdentityByCognitoSub"),
56
- index("email").sortKeys(["status"]).queryField("listUserIdentitiesByEmailAndStatus"),
57
- ])
58
- .authorization((allow) => [
59
- allow.group(adminGroup),
60
- ]),
61
- UserRoleAssignment: modelWithoutSubscriptions({
62
- id: a.id().required(),
63
- userProfileId: a.id().required(),
64
- userSub: a.string(),
65
- email: a.email(),
66
- role: a.string().required(),
67
- status: a.string().required(),
68
- grantedBy: a.string().required(),
69
- grantedAt: a.datetime().required(),
70
- revokedAt: a.datetime(),
71
- notes: a.string(),
72
- })
73
- .secondaryIndexes((index) => [
74
- index("userProfileId").sortKeys(["role"]).queryField("listUserRoleAssignmentsByProfileAndRole"),
75
- index("userSub").sortKeys(["role"]).queryField("listUserRoleAssignmentsByUserAndRole"),
76
- index("role").sortKeys(["status"]).queryField("listUserRoleAssignmentsByRoleAndStatus"),
77
- ])
78
- .authorization((allow) => [
79
- allow.group(adminGroup),
80
- ]),
81
- UserRoleMutationResult: a.customType({
82
- ok: a.boolean().required(),
83
- userProfileId: a.id(),
84
- userSub: a.string(),
85
- username: a.string(),
86
- role: a.string().required(),
87
- userSubs: a.string().array(),
88
- usernames: a.string().array(),
89
- activeRoles: a.string().array().required(),
90
- }),
91
- UserDirectoryIdentity: a.customType({
92
- id: a.id().required(),
93
- userProfileId: a.id().required(),
94
- cognitoSub: a.string().required(),
95
- provider: a.string(),
96
- email: a.email(),
97
- status: a.string().required(),
98
- linkedAt: a.datetime().required(),
99
- lastSeenAt: a.datetime(),
100
- }),
101
- UserDirectoryEntry: a.customType({
102
- userProfileId: a.id(),
103
- userSub: a.string(),
104
- username: a.string(),
105
- email: a.email(),
106
- displayName: a.string(),
107
- provider: a.string(),
108
- enabled: a.boolean(),
109
- cognitoStatus: a.string(),
110
- profileStatus: a.string(),
111
- mergedIntoProfileId: a.id(),
112
- identityStatus: a.string(),
113
- activeRoles: a.string().array().required(),
114
- identities: a.ref("UserDirectoryIdentity").array().required(),
115
- }),
116
- UserDirectoryResult: a.customType({
117
- entries: a.ref("UserDirectoryEntry").array().required(),
118
- profileCount: a.integer().required(),
119
- identityCount: a.integer().required(),
120
- cognitoUserCount: a.integer().required(),
121
- }),
122
- ReaderSettingsResult: a.customType({
123
- userProfileId: a.id().required(),
124
- settings: a.json(),
125
- }),
126
- listUserDirectory: a
127
- .query()
128
- .returns(a.ref("UserDirectoryResult"))
129
- .authorization((allow) => [allow.group(adminGroup)])
130
- .handler(a.handler.function(manageUserRole)),
131
- grantUserRole: a
132
- .mutation()
133
- .arguments({
134
- userProfileId: a.id(),
135
- userSub: a.string(),
136
- cognitoSubs: a.string().array(),
137
- role: a.string().required(),
138
- })
139
- .returns(a.ref("UserRoleMutationResult"))
140
- .authorization((allow) => [allow.group(adminGroup)])
141
- .handler(a.handler.function(manageUserRole)),
142
- revokeUserRole: a
143
- .mutation()
144
- .arguments({
145
- userProfileId: a.id(),
146
- userSub: a.string(),
147
- cognitoSubs: a.string().array(),
148
- role: a.string().required(),
149
- })
150
- .returns(a.ref("UserRoleMutationResult"))
151
- .authorization((allow) => [allow.group(adminGroup)])
152
- .handler(a.handler.function(manageUserRole)),
153
- mergeUserProfiles: a
154
- .mutation()
155
- .arguments({
156
- targetUserProfileId: a.id(),
157
- targetUserSub: a.string(),
158
- sourceUserProfileId: a.id(),
159
- sourceUserSub: a.string(),
160
- reason: a.string(),
161
- })
162
- .returns(a.ref("UserDirectoryEntry"))
163
- .authorization((allow) => [allow.group(adminGroup)])
164
- .handler(a.handler.function(manageUserRole)),
165
- getReaderSettings: a
166
- .query()
167
- .returns(a.ref("ReaderSettingsResult"))
168
- .authorization((allow) => [allow.authenticated()])
169
- .handler(a.handler.function(readerSettings)),
170
- updateReaderSettings: a
171
- .mutation()
172
- .arguments({
173
- settings: a.json().required(),
174
- })
175
- .returns(a.ref("ReaderSettingsResult"))
176
- .authorization((allow) => [allow.authenticated()])
177
- .handler(a.handler.function(readerSettings)),
178
- SteeringActionResult: a.customType({
179
- ok: a.boolean().required(),
180
- action: a.string().required(),
181
- proposalId: a.id(),
182
- categorySetId: a.id(),
183
- categoryId: a.id(),
184
- decisionId: a.id(),
185
- status: a.string(),
186
- }),
187
- reviewSteeringProposal: a
188
- .mutation()
189
- .arguments({
190
- proposalId: a.id().required(),
191
- action: a.string().required(),
192
- actorSub: a.string(),
193
- actorLabel: a.string(),
194
- note: a.string(),
195
- displayName: a.string(),
196
- shortTitle: a.string(),
197
- subtitle: a.string(),
198
- description: a.string(),
199
- aliases: a.string().array(),
200
- seedItemIds: a.string().array(),
201
- holdoutItemIds: a.string().array(),
202
- })
203
- .returns(a.ref("SteeringActionResult"))
204
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
205
- .handler(a.handler.function(categoryAction)),
206
- CurationDelegationResult: a.customType({
207
- ok: a.boolean().required(),
208
- delegationId: a.id().required(),
209
- token: a.string(),
210
- agentLabel: a.string().required(),
211
- grantorLabel: a.string(),
212
- expiresAt: a.datetime().required(),
213
- revokedAt: a.datetime(),
214
- state: a.string(),
215
- userCode: a.string(),
216
- requestedHours: a.integer(),
217
- pendingExpiresAt: a.datetime(),
218
- approvedAt: a.datetime(),
219
- deniedAt: a.datetime(),
220
- }),
221
- CurationDelegationRequestResult: a.customType({
222
- ok: a.boolean().required(),
223
- delegationId: a.id().required(),
224
- userCode: a.string().required(),
225
- pendingExpiresAt: a.datetime().required(),
226
- requestedHours: a.integer().required(),
227
- }),
228
- CurationDelegationStatusResult: a.customType({
229
- delegationId: a.id().required(),
230
- state: a.string().required(),
231
- expiresAt: a.datetime().required(),
232
- grantorLabel: a.string(),
233
- }),
234
- ReferenceCurationActionResult: a.customType({
235
- ok: a.boolean().required(),
236
- action: a.string().required(),
237
- referenceId: a.id().required(),
238
- status: a.string().required(),
239
- reasonCode: a.string(),
240
- messageId: a.id(),
241
- relationId: a.id(),
242
- }),
243
- ReferenceQualityActionResult: a.customType({
244
- ok: a.boolean().required(),
245
- referenceId: a.id().required(),
246
- rating: a.integer().required(),
247
- status: a.string().required(),
248
- relationId: a.id(),
249
- }),
250
- CategorySetDraftActionResult: a.customType({
251
- ok: a.boolean().required(),
252
- action: a.string().required(),
253
- categorySetId: a.id().required(),
254
- sourceCategorySetId: a.id(),
255
- categoryCount: a.integer(),
256
- status: a.string(),
257
- }),
258
- TopicLabelActionResult: a.customType({
259
- ok: a.boolean().required(),
260
- action: a.string().required(),
261
- referenceId: a.id(),
262
- categoryId: a.id(),
263
- relationId: a.id(),
264
- sourceRelationId: a.id(),
265
- status: a.string(),
266
- }),
267
- reviewReferenceCuration: a
268
- .mutation()
269
- .arguments({
270
- referenceId: a.id().required(),
271
- action: a.string().required(),
272
- actorSub: a.string(),
273
- actorLabel: a.string(),
274
- note: a.string(),
275
- reasonCode: a.string(),
276
- decisionRelationId: a.id(),
277
- shareable: a.boolean(),
278
- sectionId: a.id(),
279
- })
280
- .returns(a.ref("ReferenceCurationActionResult"))
281
- .authorization((allow) => [
282
- allow.groups(categoryWriteGroups),
283
- ])
284
- .handler(a.handler.function(categoryAction)),
285
- createCurationDelegation: a
286
- .mutation()
287
- .arguments({
288
- agentLabel: a.string().required(),
289
- hours: a.integer(),
290
- })
291
- .returns(a.ref("CurationDelegationResult"))
292
- .authorization((allow) => [
293
- allow.groups(categoryWriteGroups),
294
- ])
295
- .handler(a.handler.function(categoryAction)),
296
- revokeCurationDelegation: a
297
- .mutation()
298
- .arguments({
299
- delegationId: a.id().required(),
300
- })
301
- .returns(a.ref("CurationDelegationResult"))
302
- .authorization((allow) => [
303
- allow.groups(categoryWriteGroups),
304
- ])
305
- .handler(a.handler.function(categoryAction)),
306
- listCurationDelegations: a
307
- .query()
308
- .returns(a.ref("CurationDelegationResult").array())
309
- .authorization((allow) => [
310
- allow.groups(categoryWriteGroups),
311
- ])
312
- .handler(a.handler.function(categoryAction)),
313
- requestCurationDelegation: a
314
- .mutation()
315
- .arguments({
316
- delegationId: a.id().required(),
317
- tokenHash: a.string().required(),
318
- agentLabel: a.string().required(),
319
- hours: a.integer(),
320
- })
321
- .returns(a.ref("CurationDelegationRequestResult"))
322
- .authorization((allow) => [
323
- allow.authenticated("identityPool"),
324
- ])
325
- .handler(a.handler.function(categoryAction)),
326
- approveCurationDelegation: a
327
- .mutation()
328
- .arguments({
329
- userCode: a.string().required(),
330
- })
331
- .returns(a.ref("CurationDelegationResult"))
332
- .authorization((allow) => [
333
- allow.groups(categoryWriteGroups),
334
- ])
335
- .handler(a.handler.function(categoryAction)),
336
- denyCurationDelegation: a
337
- .mutation()
338
- .arguments({
339
- userCode: a.string().required(),
340
- })
341
- .returns(a.ref("CurationDelegationResult"))
342
- .authorization((allow) => [
343
- allow.groups(categoryWriteGroups),
344
- ])
345
- .handler(a.handler.function(categoryAction)),
346
- getCurationDelegationStatus: a
347
- .query()
348
- .arguments({
349
- delegationId: a.id().required(),
350
- })
351
- .returns(a.ref("CurationDelegationStatusResult"))
352
- .authorization((allow) => [
353
- allow.authenticated("identityPool"),
354
- ])
355
- .handler(a.handler.function(categoryAction)),
356
- recordDelegatedCuration: a
357
- .mutation()
358
- .arguments({
359
- referenceId: a.id().required(),
360
- action: a.string().required(),
361
- delegationId: a.id().required(),
362
- delegationToken: a.string().required(),
363
- agentLabel: a.string().required(),
364
- onBehalfOf: a.string().required(),
365
- instruction: a.string().required(),
366
- note: a.string(),
367
- reasonCode: a.string(),
368
- decisionRelationId: a.id(),
369
- shareable: a.boolean(),
370
- sectionId: a.id(),
371
- })
372
- .returns(a.ref("ReferenceCurationActionResult"))
373
- .authorization((allow) => [
374
- allow.authenticated("identityPool"),
375
- ])
376
- .handler(a.handler.function(categoryAction)),
377
- setReferenceQualityRating: a
378
- .mutation()
379
- .arguments({
380
- referenceId: a.id().required(),
381
- rating: a.integer().required(),
382
- actorSub: a.string(),
383
- actorLabel: a.string(),
384
- note: a.string(),
385
- })
386
- .returns(a.ref("ReferenceQualityActionResult"))
387
- .authorization((allow) => [
388
- allow.groups(categoryWriteGroups),
389
- ])
390
- .handler(a.handler.function(categoryAction)),
391
- createCategorySetDraft: a
392
- .mutation()
393
- .arguments({
394
- sourceCategorySetId: a.id().required(),
395
- displayName: a.string(),
396
- actorLabel: a.string(),
397
- note: a.string(),
398
- })
399
- .returns(a.ref("CategorySetDraftActionResult"))
400
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
401
- .handler(a.handler.function(categoryAction)),
402
- promoteCategorySetDraft: a
403
- .mutation()
404
- .arguments({
405
- categorySetId: a.id().required(),
406
- actorLabel: a.string(),
407
- note: a.string(),
408
- })
409
- .returns(a.ref("CategorySetDraftActionResult"))
410
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
411
- .handler(a.handler.function(categoryAction)),
412
- discardCategorySetDraft: a
413
- .mutation()
414
- .arguments({
415
- categorySetId: a.id().required(),
416
- actorLabel: a.string(),
417
- note: a.string(),
418
- })
419
- .returns(a.ref("CategorySetDraftActionResult"))
420
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
421
- .handler(a.handler.function(categoryAction)),
422
- createDraftCategory: a
423
- .mutation()
424
- .arguments({
425
- categorySetId: a.id().required(),
426
- parentCategoryKey: a.string(),
427
- displayName: a.string().required(),
428
- shortTitle: a.string(),
429
- subtitle: a.string(),
430
- description: a.string(),
431
- actorLabel: a.string(),
432
- note: a.string(),
433
- })
434
- .returns(a.ref("SteeringActionResult"))
435
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
436
- .handler(a.handler.function(categoryAction)),
437
- updateDraftCategory: a
438
- .mutation()
439
- .arguments({
440
- categoryId: a.id().required(),
441
- displayName: a.string(),
442
- shortTitle: a.string(),
443
- subtitle: a.string(),
444
- description: a.string(),
445
- parentCategoryKey: a.string(),
446
- actorLabel: a.string(),
447
- note: a.string(),
448
- })
449
- .returns(a.ref("SteeringActionResult"))
450
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
451
- .handler(a.handler.function(categoryAction)),
452
- archiveDraftCategory: a
453
- .mutation()
454
- .arguments({
455
- categoryId: a.id().required(),
456
- actorLabel: a.string(),
457
- note: a.string(),
458
- })
459
- .returns(a.ref("SteeringActionResult"))
460
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
461
- .handler(a.handler.function(categoryAction)),
462
- reviewReferenceTopicLabel: a
463
- .mutation()
464
- .arguments({
465
- referenceId: a.id().required(),
466
- categoryId: a.id().required(),
467
- action: a.string().required(),
468
- sourceRelationId: a.id(),
469
- actorLabel: a.string(),
470
- note: a.string(),
471
- })
472
- .returns(a.ref("TopicLabelActionResult"))
473
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
474
- .handler(a.handler.function(categoryAction)),
475
- NewsroomSummary: a.customType({
476
- generatedAt: a.datetime().required(),
477
- staleAt: a.datetime(),
478
- source: a.string(),
479
- latestImportRun: a.json(),
480
- counts: a.json().required(),
481
- facets: a.json(),
482
- assignmentStatusCounts: a.json().required(),
483
- assignmentTypeCounts: a.json().required(),
484
- referenceStatusCounts: a.json().required(),
485
- messageKindCounts: a.json().required(),
486
- messageDomainCounts: a.json().required(),
487
- }),
488
- getNewsroomSummary: a
489
- .query()
490
- .returns(a.ref("NewsroomSummary"))
491
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
492
- .handler(a.handler.function(newsroomSummary)),
493
- deriveMarkus: a
494
- .query()
495
- .arguments({ input: a.json().required() })
496
- .returns(a.json())
497
- .authorization((allow) => [allow.groups(contentWriteGroups)])
498
- .handler(a.handler.function(contentActions)),
499
- saveItemDraft: a
500
- .mutation()
501
- .arguments({ input: a.json().required() })
502
- .returns(a.json())
503
- .authorization((allow) => [allow.groups(contentWriteGroups)])
504
- .handler(a.handler.function(contentActions)),
505
- publishItem: a
506
- .mutation()
507
- .arguments({ input: a.json().required() })
508
- .returns(a.json())
509
- .authorization((allow) => [allow.groups(contentWriteGroups)])
510
- .handler(a.handler.function(contentActions)),
511
- unpublishItem: a
512
- .mutation()
513
- .arguments({ input: a.json().required() })
514
- .returns(a.json())
515
- .authorization((allow) => [allow.groups(contentWriteGroups)])
516
- .handler(a.handler.function(contentActions)),
517
- requestStagingBuild: a
518
- .mutation()
519
- .arguments({ input: a.json().required() })
520
- .returns(a.json())
521
- .authorization((allow) => [allow.groups(contentWriteGroups)])
522
- .handler(a.handler.function(contentActions)),
523
- knowledgeQuery: a
524
- .query()
525
- .arguments({
526
- input: a.json().required(),
527
- })
528
- .returns(a.json())
529
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
530
- .handler(a.handler.function(knowledgeQuery)),
531
- updateNewsroomSummary: a
532
- .mutation()
533
- .arguments({
534
- delta: a.json().required(),
535
- actorLabel: a.string(),
536
- reason: a.string(),
537
- })
538
- .returns(a.ref("NewsroomSummary"))
539
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
540
- .handler(a.handler.function(newsroomSummary)),
541
- ModelAttachmentUploadSlot: a.customType({
542
- ok: a.boolean().required(),
543
- uploadId: a.string().required(),
544
- attachmentId: a.id().required(),
545
- ownerKind: a.string().required(),
546
- ownerId: a.id().required(),
547
- role: a.string().required(),
548
- sortKey: a.string().required(),
549
- method: a.string().required(),
550
- uploadUrl: a.string().required(),
551
- storagePath: a.string().required(),
552
- mediaType: a.string().required(),
553
- byteSize: a.integer().required(),
554
- sha256: a.string(),
555
- expiresAt: a.datetime().required(),
556
- requiredHeaders: a.json(),
557
- }),
558
- ModelAttachmentDownloadSlot: a.customType({
559
- ok: a.boolean().required(),
560
- attachmentId: a.id().required(),
561
- method: a.string().required(),
562
- downloadUrl: a.string().required(),
563
- storagePath: a.string().required(),
564
- mediaType: a.string().required(),
565
- byteSize: a.integer().required(),
566
- sha256: a.string(),
567
- expiresAt: a.datetime().required(),
568
- requiredHeaders: a.json(),
569
- }),
570
- ModelAttachmentUploadAbortResult: a.customType({
571
- ok: a.boolean().required(),
572
- uploadId: a.string().required(),
573
- attachmentId: a.id().required(),
574
- storagePath: a.string().required(),
575
- status: a.string().required(),
576
- }),
577
- createModelAttachmentUpload: a
578
- .mutation()
579
- .arguments({
580
- ownerKind: a.string().required(),
581
- ownerId: a.id().required(),
582
- ownerLineageId: a.id(),
583
- ownerVersionNumber: a.integer(),
584
- ownerVersionKey: a.string(),
585
- role: a.string().required(),
586
- sortKey: a.string(),
587
- filename: a.string().required(),
588
- mediaType: a.string().required(),
589
- byteSize: a.integer().required(),
590
- sha256: a.string(),
591
- importRunId: a.id(),
592
- status: a.string(),
593
- })
594
- .returns(a.ref("ModelAttachmentUploadSlot"))
595
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
596
- .handler(a.handler.function(modelAttachmentUpload)),
597
- completeModelAttachmentUpload: a
598
- .mutation()
599
- .arguments({
600
- uploadId: a.string().required(),
601
- ownerKind: a.string().required(),
602
- ownerId: a.id().required(),
603
- ownerLineageId: a.id(),
604
- ownerVersionNumber: a.integer(),
605
- ownerVersionKey: a.string(),
606
- role: a.string().required(),
607
- sortKey: a.string(),
608
- filename: a.string().required(),
609
- mediaType: a.string().required(),
610
- byteSize: a.integer().required(),
611
- sha256: a.string(),
612
- importRunId: a.id(),
613
- status: a.string(),
614
- })
615
- .returns(a.ref("ModelAttachment"))
616
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
617
- .handler(a.handler.function(modelAttachmentUpload)),
618
- abortModelAttachmentUpload: a
619
- .mutation()
620
- .arguments({
621
- uploadId: a.string().required(),
622
- ownerKind: a.string().required(),
623
- ownerId: a.id().required(),
624
- ownerLineageId: a.id(),
625
- ownerVersionNumber: a.integer(),
626
- ownerVersionKey: a.string(),
627
- role: a.string().required(),
628
- sortKey: a.string(),
629
- filename: a.string().required(),
630
- mediaType: a.string().required(),
631
- byteSize: a.integer().required(),
632
- sha256: a.string(),
633
- importRunId: a.id(),
634
- status: a.string(),
635
- })
636
- .returns(a.ref("ModelAttachmentUploadAbortResult"))
637
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
638
- .handler(a.handler.function(modelAttachmentUpload)),
639
- createModelAttachmentDownload: a
640
- .mutation()
641
- .arguments({
642
- attachmentId: a.id().required(),
643
- })
644
- .returns(a.ref("ModelAttachmentDownloadSlot"))
645
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
646
- .handler(a.handler.function(modelAttachmentUpload)),
647
- AssignmentActionResult: a.customType({
648
- ok: a.boolean().required(),
649
- assignmentId: a.id(),
650
- eventId: a.id(),
651
- status: a.string(),
652
- action: a.string().required(),
653
- assigneeKey: a.string(),
654
- claimExpiresAt: a.datetime(),
655
- }),
656
- AssignmentTargetSummary: a.customType({
657
- kind: a.string().required(),
658
- id: a.id().required(),
659
- lineageId: a.id().required(),
660
- label: a.string(),
661
- detail: a.string(),
662
- }),
663
- AssignmentSummary: a.customType({
664
- id: a.id().required(),
665
- assignmentTypeKey: a.string().required(),
666
- queueKey: a.string().required(),
667
- queueStatusKey: a.string().required(),
668
- status: a.string().required(),
669
- priority: a.integer(),
670
- title: a.string().required(),
671
- summary: a.string(),
672
- assigneeType: a.string(),
673
- assigneeId: a.string(),
674
- assigneeKey: a.string(),
675
- claimedAt: a.datetime(),
676
- claimExpiresAt: a.datetime(),
677
- completedAt: a.datetime(),
678
- canceledAt: a.datetime(),
679
- corpusId: a.id(),
680
- categorySetId: a.id(),
681
- classifierId: a.string(),
682
- sectionId: a.id(),
683
- sectionKey: a.string(),
684
- sectionType: a.string(),
685
- sectionStatusKey: a.string(),
686
- sectionQueueStatusKey: a.string(),
687
- primaryFocusCategoryKey: a.string(),
688
- topicScopeCategoryKeys: a.string().array(),
689
- sourceSnapshotId: a.string(),
690
- importRunId: a.id(),
691
- createdBy: a.string(),
692
- createdAt: a.datetime().required(),
693
- updatedAt: a.datetime().required(),
694
- }),
695
- AssignmentEventSummary: a.customType({
696
- id: a.id().required(),
697
- assignmentId: a.id().required(),
698
- assignmentTypeKey: a.string().required(),
699
- queueKey: a.string().required(),
700
- eventType: a.string().required(),
701
- fromStatus: a.string(),
702
- toStatus: a.string(),
703
- actorSub: a.string(),
704
- actorLabel: a.string(),
705
- note: a.string(),
706
- createdAt: a.datetime().required(),
707
- }),
708
- AssignmentDoctrineSummary: a.customType({
709
- scope: a.string().required(),
710
- kind: a.string().required(),
711
- label: a.string().required(),
712
- slug: a.string().required(),
713
- body: a.string().array().required(),
714
- categoryKey: a.string(),
715
- categoryLineageId: a.id(),
716
- }),
717
- AssignmentContext: a.customType({
718
- editorialContext: a.json().required(),
719
- assignment: a.ref("AssignmentSummary"),
720
- doctrine: a.ref("AssignmentDoctrineSummary").array().required(),
721
- targets: a.ref("AssignmentTargetSummary").array().required(),
722
- events: a.ref("AssignmentEventSummary").array().required(),
723
- }),
724
- listAssignmentsForObject: a
725
- .query()
726
- .arguments({
727
- objectKind: a.string().required(),
728
- objectLineageId: a.id().required(),
729
- status: a.string(),
730
- limit: a.integer(),
731
- })
732
- .returns(a.ref("AssignmentContext").array().required())
733
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
734
- .handler(a.handler.function(assignmentAction)),
735
- listAssignmentQueue: a
736
- .query()
737
- .arguments({
738
- queueKey: a.string().required(),
739
- status: a.string(),
740
- limit: a.integer(),
741
- })
742
- .returns(a.ref("AssignmentContext").array().required())
743
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
744
- .handler(a.handler.function(assignmentAction)),
745
- getEditorialContext: a
746
- .query()
747
- .arguments({
748
- publicationKey: a.string().required(),
749
- sectionId: a.id(),
750
- storyLineageId: a.id(),
751
- assignmentId: a.id(),
752
- maxCharacters: a.integer(),
753
- })
754
- .returns(a.json().required())
755
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
756
- .handler(a.handler.function(assignmentAction)),
757
- getAssignmentContext: a
758
- .query()
759
- .arguments({
760
- assignmentId: a.id().required(),
761
- })
762
- .returns(a.ref("AssignmentContext"))
763
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
764
- .handler(a.handler.function(assignmentAction)),
765
- claimAssignment: a
766
- .mutation()
767
- .arguments({
768
- assignmentId: a.id().required(),
769
- assigneeKey: a.string(),
770
- assigneeType: a.string(),
771
- assigneeId: a.string(),
772
- claimExpiresAt: a.datetime(),
773
- claimTtlSeconds: a.integer(),
774
- actorSub: a.string(),
775
- actorLabel: a.string(),
776
- note: a.string(),
777
- })
778
- .returns(a.ref("AssignmentActionResult"))
779
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
780
- .handler(a.handler.function(assignmentAction)),
781
- releaseAssignment: a
782
- .mutation()
783
- .arguments({
784
- assignmentId: a.id().required(),
785
- actorSub: a.string(),
786
- actorLabel: a.string(),
787
- note: a.string(),
788
- })
789
- .returns(a.ref("AssignmentActionResult"))
790
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
791
- .handler(a.handler.function(assignmentAction)),
792
- completeAssignment: a
793
- .mutation()
794
- .arguments({
795
- assignmentId: a.id().required(),
796
- actorSub: a.string(),
797
- actorLabel: a.string(),
798
- note: a.string(),
799
- })
800
- .returns(a.ref("AssignmentActionResult"))
801
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
802
- .handler(a.handler.function(assignmentAction)),
803
- cancelAssignment: a
804
- .mutation()
805
- .arguments({
806
- assignmentId: a.id().required(),
807
- actorSub: a.string(),
808
- actorLabel: a.string(),
809
- note: a.string(),
810
- })
811
- .returns(a.ref("AssignmentActionResult"))
812
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
813
- .handler(a.handler.function(assignmentAction)),
814
- reopenAssignment: a
815
- .mutation()
816
- .arguments({
817
- assignmentId: a.id().required(),
818
- actorSub: a.string(),
819
- actorLabel: a.string(),
820
- note: a.string(),
821
- })
822
- .returns(a.ref("AssignmentActionResult"))
823
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
824
- .handler(a.handler.function(assignmentAction)),
825
- retryImmediateAssignment: a
826
- .mutation()
827
- .arguments({
828
- assignmentId: a.id().required(),
829
- actorSub: a.string(),
830
- actorLabel: a.string(),
831
- note: a.string(),
832
- })
833
- .returns(a.ref("AssignmentActionResult"))
834
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
835
- .handler(a.handler.function(assignmentAction)),
836
- listNewsroomProcedureDefinitions: a
837
- .query()
838
- .returns(a.json())
839
- .authorization((allow) => [allow.group(adminGroup)])
840
- .handler(a.handler.function(procedureAction)),
841
- getNewsroomProcedureDefinition: a
842
- .query()
843
- .arguments({
844
- id: a.id(),
845
- procedureKey: a.string(),
846
- })
847
- .returns(a.json())
848
- .authorization((allow) => [allow.group(adminGroup)])
849
- .handler(a.handler.function(procedureAction)),
850
- saveNewsroomProcedureDefinition: a
851
- .mutation()
852
- .arguments({
853
- input: a.json().required(),
854
- })
855
- .returns(a.json())
856
- .authorization((allow) => [allow.group(adminGroup)])
857
- .handler(a.handler.function(procedureAction)),
858
- saveNewsroomProcedureVersionDraft: a
859
- .mutation()
860
- .arguments({
861
- input: a.json().required(),
862
- })
863
- .returns(a.json())
864
- .authorization((allow) => [allow.group(adminGroup)])
865
- .handler(a.handler.function(procedureAction)),
866
- publishNewsroomProcedureVersion: a
867
- .mutation()
868
- .arguments({
869
- versionId: a.id().required(),
870
- })
871
- .returns(a.json())
872
- .authorization((allow) => [allow.group(adminGroup)])
873
- .handler(a.handler.function(procedureAction)),
874
- startNewsroomProcedureRun: a
875
- .mutation()
876
- .arguments({
877
- procedureId: a.id(),
878
- procedureKey: a.string(),
879
- procedureVersionId: a.id(),
880
- title: a.string(),
881
- summary: a.string(),
882
- input: a.json(),
883
- actorLabel: a.string(),
884
- })
885
- .returns(a.json())
886
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
887
- .handler(a.handler.function(procedureAction)),
888
- getNewsroomProcedureRun: a
889
- .query()
890
- .arguments({
891
- id: a.id().required(),
892
- })
893
- .returns(a.json())
894
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
895
- .handler(a.handler.function(procedureAction)),
896
- listNewsroomProcedureRunsByProcedure: a
897
- .query()
898
- .arguments({
899
- procedureId: a.id().required(),
900
- })
901
- .returns(a.json())
902
- .authorization((allow) => [allow.groups(categoryWriteGroups)])
903
- .handler(a.handler.function(procedureAction)),
904
- Assignment: modelWithoutSubscriptions({
905
- id: a.id().required(),
906
- assignmentTypeKey: a.string().required(),
907
- queueKey: a.string().required(),
908
- queueStatusKey: a.string().required(),
909
- status: a.string().required(),
910
- priority: a.integer(),
911
- title: a.string().required(),
912
- summary: a.string(),
913
- assigneeType: a.string(),
914
- assigneeId: a.string(),
915
- assigneeKey: a.string(),
916
- claimedAt: a.datetime(),
917
- claimExpiresAt: a.datetime(),
918
- completedAt: a.datetime(),
919
- canceledAt: a.datetime(),
920
- corpusId: a.id(),
921
- categorySetId: a.id(),
922
- classifierId: a.string(),
923
- sectionId: a.id(),
924
- sectionKey: a.string(),
925
- sectionType: a.string(),
926
- sectionStatusKey: a.string(),
927
- sectionQueueStatusKey: a.string(),
928
- primaryFocusCategoryKey: a.string(),
929
- topicScopeCategoryKeys: a.string().array(),
930
- sourceSnapshotId: a.string(),
931
- importRunId: a.id(),
932
- createdBy: a.string(),
933
- createdAt: a.datetime().required(),
934
- updatedAt: a.datetime().required(),
935
- newsroomFeedKey: a.string(),
936
- itemLineageId: a.id(),
937
- })
938
- .secondaryIndexes((index) => [
939
- index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listAssignmentsByNewsroomFeedAndCreatedAt"),
940
- index("itemLineageId").sortKeys(["createdAt"]).queryField("listAssignmentsByItemLineageAndCreatedAt"),
941
- index("queueStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsByQueueStatusAndPriority"),
942
- index("assignmentTypeKey").sortKeys(["status", "createdAt"]).queryField("listAssignmentsByTypeStatusAndCreatedAt"),
943
- index("status").sortKeys(["updatedAt"]).queryField("listAssignmentsByStatusAndUpdatedAt"),
944
- index("assigneeKey").sortKeys(["status", "updatedAt"]).queryField("listAssignmentsByAssigneeStatusAndUpdatedAt"),
945
- index("importRunId").sortKeys(["createdAt"]).queryField("listAssignmentsByImportRunAndCreatedAt"),
946
- index("sectionStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsBySectionStatusAndPriority"),
947
- index("sectionKey").sortKeys(["createdAt"]).queryField("listAssignmentsBySectionAndCreatedAt"),
948
- index("sectionQueueStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsBySectionQueueStatusAndPriority"),
949
- ])
950
- .authorization((allow) => [
951
- allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
952
- ]),
953
- AssignmentEvent: modelWithoutSubscriptions({
954
- id: a.id().required(),
955
- assignmentId: a.id().required(),
956
- assignmentTypeKey: a.string().required(),
957
- queueKey: a.string().required(),
958
- eventType: a.string().required(),
959
- fromStatus: a.string(),
960
- toStatus: a.string(),
961
- actorSub: a.string(),
962
- actorLabel: a.string(),
963
- note: a.string(),
964
- createdAt: a.datetime().required(),
965
- })
966
- .secondaryIndexes((index) => [
967
- index("assignmentId").sortKeys(["createdAt"]).queryField("listAssignmentEventsByAssignmentAndCreatedAt"),
968
- index("eventType").sortKeys(["createdAt"]).queryField("listAssignmentEventsByTypeAndCreatedAt"),
969
- index("queueKey").sortKeys(["createdAt"]).queryField("listAssignmentEventsByQueueAndCreatedAt"),
970
- ])
971
- .authorization((allow) => [
972
- allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
973
- ]),
974
- ProcedureDefinition: modelWithoutSubscriptions({
975
- id: a.id().required(),
976
- procedureKey: a.string().required(),
977
- title: a.string().required(),
978
- category: a.string().required(),
979
- description: a.string(),
980
- enabled: a.boolean().required(),
981
- enabledStatus: a.string().required(),
982
- currentVersionId: a.id(),
983
- createdBy: a.string(),
984
- createdAt: a.datetime().required(),
985
- updatedBy: a.string(),
986
- updatedAt: a.datetime().required(),
987
- newsroomFeedKey: a.string(),
988
- })
989
- .secondaryIndexes((index) => [
990
- index("procedureKey").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByKeyAndUpdatedAt"),
991
- index("enabledStatus").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByEnabledAndUpdatedAt"),
992
- index("newsroomFeedKey").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByFeedAndUpdatedAt"),
993
- ])
994
- .authorization((allow) => [
995
- allow.group(adminGroup),
996
- ]),
997
- ProcedureVersion: modelWithoutSubscriptions({
998
- id: a.id().required(),
999
- procedureId: a.id().required(),
1000
- procedureKey: a.string().required(),
1001
- versionNumber: a.integer().required(),
1002
- status: a.string().required(),
1003
- isCurrent: a.boolean().required(),
1004
- label: a.string(),
1005
- tactusSource: a.string().required(),
1006
- parameterSchema: a.json().required(),
1007
- defaults: a.json(),
1008
- changelog: a.string(),
1009
- createdBy: a.string(),
1010
- createdAt: a.datetime().required(),
1011
- updatedBy: a.string(),
1012
- updatedAt: a.datetime().required(),
1013
- })
1014
- .secondaryIndexes((index) => [
1015
- index("procedureId").sortKeys(["versionNumber"]).queryField("listProcedureVersionsByProcedureAndVersion"),
1016
- index("procedureId").sortKeys(["createdAt"]).queryField("listProcedureVersionsByProcedureAndCreatedAt"),
1017
- index("status").sortKeys(["updatedAt"]).queryField("listProcedureVersionsByStatusAndUpdatedAt"),
1018
- ])
1019
- .authorization((allow) => [
1020
- allow.group(adminGroup),
1021
- ]),
1022
- ProcedureRun: modelWithoutSubscriptions({
1023
- id: a.id().required(),
1024
- procedureId: a.id().required(),
1025
- procedureKey: a.string().required(),
1026
- procedureVersionId: a.id().required(),
1027
- procedureVersionNumber: a.integer(),
1028
- assignmentId: a.id(),
1029
- runStatus: a.string().required(),
1030
- requestedBy: a.string(),
1031
- requestedAt: a.datetime().required(),
1032
- startedAt: a.datetime(),
1033
- finishedAt: a.datetime(),
1034
- input: a.json(),
1035
- normalizedInput: a.json(),
1036
- resultSummary: a.string(),
1037
- errorSummary: a.string(),
1038
- output: a.json(),
1039
- error: a.json(),
1040
- attempt: a.integer(),
1041
- newsroomFeedKey: a.string(),
1042
- })
1043
- .secondaryIndexes((index) => [
1044
- index("procedureId").sortKeys(["requestedAt"]).queryField("listProcedureRunsByProcedureAndRequestedAt"),
1045
- index("assignmentId").sortKeys(["requestedAt"]).queryField("listProcedureRunsByAssignmentAndRequestedAt"),
1046
- index("runStatus").sortKeys(["requestedAt"]).queryField("listProcedureRunsByStatusAndRequestedAt"),
1047
- index("newsroomFeedKey").sortKeys(["requestedAt"]).queryField("listProcedureRunsByFeedAndRequestedAt"),
1048
- ])
1049
- .authorization((allow) => [
1050
- allow.group("editor").to(["read"]),
1051
- allow.group(adminGroup).to(authoringOperations),
1052
- ]),
1053
- NewsroomSection: modelWithoutSubscriptions({
1054
- id: a.id().required(),
1055
- tenantId: a.string(),
1056
- title: a.string().required(),
1057
- type: a.string().required(),
1058
- editorialMission: a.string().required(),
1059
- editorialPolicy: a.string().required(),
1060
- enabled: a.boolean().required(),
1061
- enabledStatus: a.string().required(),
1062
- sortOrder: a.integer().required(),
1063
- shortTitle: a.string().required(),
1064
- defaultArticleTypes: a.string().array(),
1065
- defaultPageBudget: a.integer(),
1066
- assignmentGuidance: a.string(),
1067
- killCriteria: a.string(),
1068
- visualGuidance: a.string(),
1069
- createdAt: a.datetime(),
1070
- updatedAt: a.datetime(),
1071
- })
1072
- .secondaryIndexes((index) => [
1073
- index("sortOrder").sortKeys(["id"]).queryField("listNewsroomSectionsBySortOrder"),
1074
- index("tenantId").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByTenantAndSortOrder"),
1075
- index("type").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByTypeAndSortOrder"),
1076
- index("enabledStatus").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByEnabledStatusAndSortOrder"),
1077
- ])
1078
- .authorization((allow) => [
1079
- allow.groups(categoryWriteGroups),
1080
- ]),
1081
- KnowledgeCorpus: modelWithoutSubscriptions({
1082
- id: a.id().required(),
1083
- name: a.string().required(),
1084
- role: a.string().required(),
1085
- itemCount: a.integer(),
1086
- generatedAt: a.datetime(),
1087
- latestImportRunId: a.id(),
1088
- createdAt: a.datetime(),
1089
- updatedAt: a.datetime(),
1090
- })
1091
- .secondaryIndexes((index) => [
1092
- index("role").sortKeys(["name"]).queryField("listKnowledgeCorporaByRoleAndName"),
1093
- ])
1094
- .authorization((allow) => [
1095
- allow.groups(categoryWriteGroups).to(["read"]),
1096
- ]),
1097
- KnowledgeImportRun: modelWithoutSubscriptions({
1098
- id: a.id().required(),
1099
- corpusId: a.id().required(),
1100
- importKind: a.string().required(),
1101
- corpusImportKindKey: a.string(),
1102
- classifierId: a.string(),
1103
- sourceSnapshotId: a.string(),
1104
- status: a.string().required(),
1105
- generatedAt: a.datetime(),
1106
- importedAt: a.datetime().required(),
1107
- itemCount: a.integer(),
1108
- categoryCount: a.integer(),
1109
- proposalCount: a.integer(),
1110
- artifactCount: a.integer(),
1111
- referenceCount: a.integer(),
1112
- relationCount: a.integer(),
1113
- warningCount: a.integer(),
1114
- })
1115
- .secondaryIndexes((index) => [
1116
- index("corpusId").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByCorpusAndImportedAt"),
1117
- index("importKind").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByKindAndImportedAt"),
1118
- index("corpusImportKindKey").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByCorpusKindAndImportedAt"),
1119
- ])
1120
- .authorization((allow) => [
1121
- allow.groups(categoryWriteGroups).to(["read"]),
1122
- ]),
1123
- KnowledgeRawPayload: modelWithoutSubscriptions({
1124
- id: a.id().required(),
1125
- ownerType: a.string().required(),
1126
- ownerId: a.id().required(),
1127
- payloadKind: a.string().required(),
1128
- importRunId: a.id(),
1129
- createdAt: a.datetime().required(),
1130
- updatedAt: a.datetime(),
1131
- })
1132
- .secondaryIndexes((index) => [
1133
- index("ownerId").sortKeys(["payloadKind"]).queryField("listKnowledgeRawPayloadsByOwnerAndKind"),
1134
- index("importRunId").sortKeys(["ownerType"]).queryField("listKnowledgeRawPayloadsByImportRunAndOwner"),
1135
- ])
1136
- .authorization((allow) => [
1137
- allow.groups(categoryWriteGroups),
1138
- ]),
1139
- KnowledgeArtifact: modelWithoutSubscriptions({
1140
- id: a.id().required(),
1141
- corpusId: a.id().required(),
1142
- artifactKind: a.string().required(),
1143
- artifactId: a.string().required(),
1144
- snapshotId: a.string(),
1145
- displayName: a.string(),
1146
- createdAt: a.datetime(),
1147
- importRunId: a.id(),
1148
- })
1149
- .secondaryIndexes((index) => [
1150
- index("corpusId").sortKeys(["artifactKind"]).queryField("listKnowledgeArtifactsByCorpusAndKind"),
1151
- index("artifactKind").sortKeys(["createdAt"]).queryField("listKnowledgeArtifactsByKindAndCreatedAt"),
1152
- index("importRunId").sortKeys(["artifactKind"]).queryField("listKnowledgeArtifactsByImportRunAndKind"),
1153
- ])
1154
- .authorization((allow) => [
1155
- allow.groups(categoryWriteGroups).to(["read"]),
1156
- ]),
1157
- CategorySet: modelWithoutSubscriptions({
1158
- id: a.id().required(),
1159
- lineageId: a.id().required(),
1160
- versionNumber: a.integer().required(),
1161
- previousVersionId: a.id(),
1162
- versionState: a.string().required(),
1163
- versionCreatedAt: a.datetime().required(),
1164
- versionCreatedBy: a.string(),
1165
- changeReason: a.string(),
1166
- contentHash: a.string(),
1167
- corpusId: a.id().required(),
1168
- classifierId: a.string().required(),
1169
- displayName: a.string().required(),
1170
- description: a.string(),
1171
- status: a.string().required(),
1172
- generatedAt: a.datetime(),
1173
- categoryCount: a.integer(),
1174
- importRunId: a.id(),
1175
- })
1176
- .secondaryIndexes((index) => [
1177
- index("lineageId").sortKeys(["versionNumber"]).queryField("listCategorySetsByLineageAndVersion"),
1178
- index("corpusId").sortKeys(["classifierId"]).queryField("listCategorySetsByCorpusAndClassifier"),
1179
- index("status").sortKeys(["displayName"]).queryField("listCategorySetsByStatusAndName"),
1180
- index("versionState").sortKeys(["generatedAt"]).queryField("listCategorySetsByVersionStateAndGeneratedAt"),
1181
- ])
1182
- .authorization((allow) => [
1183
- allow.groups(categoryWriteGroups),
1184
- ]),
1185
- Category: modelWithoutSubscriptions({
1186
- id: a.id().required(),
1187
- lineageId: a.id().required(),
1188
- versionNumber: a.integer().required(),
1189
- previousVersionId: a.id(),
1190
- versionState: a.string().required(),
1191
- versionCreatedAt: a.datetime().required(),
1192
- versionCreatedBy: a.string(),
1193
- changeReason: a.string(),
1194
- contentHash: a.string(),
1195
- categorySetId: a.id().required(),
1196
- corpusId: a.id().required(),
1197
- categoryKey: a.string().required(),
1198
- parentCategoryId: a.id(),
1199
- parentCategoryKey: a.string(),
1200
- displayName: a.string().required(),
1201
- shortTitle: a.string(),
1202
- subtitle: a.string(),
1203
- description: a.string(),
1204
- aliases: a.string().array(),
1205
- status: a.string().required(),
1206
- seedItemIds: a.string().array(),
1207
- holdoutItemIds: a.string().array(),
1208
- rank: a.integer(),
1209
- depth: a.integer(),
1210
- isPinned: a.boolean(),
1211
- importRunId: a.id(),
1212
- updatedAt: a.datetime(),
1213
- })
1214
- .secondaryIndexes((index) => [
1215
- index("lineageId").sortKeys(["versionNumber"]).queryField("listCategoriesByLineageAndVersion"),
1216
- index("categorySetId").sortKeys(["categoryKey"]).queryField("listCategoriesBySetAndKey"),
1217
- index("parentCategoryId").sortKeys(["rank"]).queryField("listCategoriesByParentAndRank"),
1218
- index("parentCategoryKey").sortKeys(["rank"]).queryField("listCategoriesByParentKeyAndRank"),
1219
- index("corpusId").sortKeys(["displayName"]).queryField("listCategoriesByCorpusAndName"),
1220
- index("status").sortKeys(["displayName"]).queryField("listCategoriesByStatusAndName"),
1221
- ])
1222
- .authorization((allow) => [
1223
- allow.groups(categoryWriteGroups),
1224
- ]),
1225
- CategoryKeyword: modelWithoutSubscriptions({
1226
- id: a.id().required(),
1227
- categorySetId: a.id().required(),
1228
- corpusId: a.id().required(),
1229
- categoryKey: a.string().required(),
1230
- categoryLineageId: a.id(),
1231
- categoryId: a.id(),
1232
- keyword: a.string().required(),
1233
- normalizedKeyword: a.string().required(),
1234
- weight: a.float(),
1235
- rank: a.integer(),
1236
- source: a.string().required(),
1237
- sourceTopicId: a.string(),
1238
- importRunId: a.id(),
1239
- metadata: a.json(),
1240
- createdAt: a.datetime().required(),
1241
- updatedAt: a.datetime(),
1242
- })
1243
- .secondaryIndexes((index) => [
1244
- index("categorySetId").sortKeys(["categoryKey", "rank"]).queryField("listCategoryKeywordsBySetKeyAndRank"),
1245
- index("categoryKey").sortKeys(["rank"]).queryField("listCategoryKeywordsByCategoryKeyAndRank"),
1246
- index("normalizedKeyword").sortKeys(["categorySetId"]).queryField("listCategoryKeywordsByNormalizedKeywordAndSet"),
1247
- index("importRunId").sortKeys(["rank"]).queryField("listCategoryKeywordsByImportRunAndRank"),
1248
- ])
1249
- .authorization((allow) => [
1250
- allow.groups(categoryWriteGroups),
1251
- ]),
1252
- LexicalSteeringRule: modelWithoutSubscriptions({
1253
- id: a.id().required(),
1254
- ruleKind: a.string().required(),
1255
- term: a.string().required(),
1256
- normalizedTerm: a.string().required(),
1257
- scope: a.string().required(),
1258
- status: a.string().required(),
1259
- corpusId: a.id(),
1260
- classifierId: a.string(),
1261
- categorySetId: a.id(),
1262
- categoryKey: a.string(),
1263
- note: a.string(),
1264
- source: a.string(),
1265
- createdBy: a.string(),
1266
- createdAt: a.datetime().required(),
1267
- updatedAt: a.datetime(),
1268
- metadata: a.json(),
1269
- })
1270
- .secondaryIndexes((index) => [
1271
- index("status").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByStatusAndTerm"),
1272
- index("scope").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByScopeAndTerm"),
1273
- index("categorySetId").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesBySetAndTerm"),
1274
- index("corpusId").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByCorpusAndTerm"),
1275
- ])
1276
- .authorization((allow) => [
1277
- allow.groups(categoryWriteGroups),
1278
- ]),
1279
- SteeringProposal: modelWithoutSubscriptions({
1280
- id: a.id().required(),
1281
- categorySetId: a.id(),
1282
- corpusId: a.id().required(),
1283
- importRunId: a.id(),
1284
- proposalKind: a.string().required(),
1285
- steeringDomain: a.string().required(),
1286
- status: a.string().required(),
1287
- title: a.string().required(),
1288
- summary: a.string(),
1289
- categoryKey: a.string(),
1290
- targetCategoryKey: a.string(),
1291
- graphEntityId: a.string(),
1292
- relationshipType: a.string(),
1293
- displayName: a.string(),
1294
- shortTitle: a.string(),
1295
- subtitle: a.string(),
1296
- description: a.string(),
1297
- evidenceItemIds: a.string().array(),
1298
- suggestedSeedItemIds: a.string().array(),
1299
- suggestedHoldoutItemIds: a.string().array(),
1300
- sourceSnapshotId: a.string(),
1301
- proposedAt: a.datetime(),
1302
- reviewedAt: a.datetime(),
1303
- reviewedBy: a.string(),
1304
- updatedAt: a.datetime(),
1305
- })
1306
- .secondaryIndexes((index) => [
1307
- index("status").sortKeys(["proposedAt"]).queryField("listSteeringProposalsByStatusAndProposedAt"),
1308
- index("categorySetId").sortKeys(["status"]).queryField("listSteeringProposalsBySetAndStatus"),
1309
- index("corpusId").sortKeys(["proposalKind"]).queryField("listSteeringProposalsByCorpusAndKind"),
1310
- index("steeringDomain").sortKeys(["status"]).queryField("listSteeringProposalsByDomainAndStatus"),
1311
- ])
1312
- .authorization((allow) => [
1313
- allow.groups(categoryWriteGroups).to(["read"]),
1314
- ]),
1315
- SteeringDecision: modelWithoutSubscriptions({
1316
- id: a.id().required(),
1317
- proposalId: a.id().required(),
1318
- categorySetId: a.id(),
1319
- action: a.string().required(),
1320
- actorSub: a.string(),
1321
- actorLabel: a.string(),
1322
- note: a.string(),
1323
- selectedCategoryKey: a.string(),
1324
- createdAt: a.datetime().required(),
1325
- })
1326
- .secondaryIndexes((index) => [
1327
- index("proposalId").sortKeys(["createdAt"]).queryField("listSteeringDecisionsByProposalAndCreatedAt"),
1328
- index("categorySetId").sortKeys(["createdAt"]).queryField("listSteeringDecisionsBySetAndCreatedAt"),
1329
- ])
1330
- .authorization((allow) => [
1331
- allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1332
- ]),
1333
- Reference: realtimeModel({
1334
- id: a.id().required(),
1335
- lineageId: a.id().required(),
1336
- versionNumber: a.integer().required(),
1337
- previousVersionId: a.id(),
1338
- versionState: a.string().required(),
1339
- versionCreatedAt: a.datetime().required(),
1340
- versionCreatedBy: a.string(),
1341
- changeReason: a.string(),
1342
- contentHash: a.string(),
1343
- corpusId: a.id().required(),
1344
- externalItemId: a.string().required(),
1345
- title: a.string(),
1346
- authors: a.string().array(),
1347
- sourceUri: a.string(),
1348
- storagePath: a.string(),
1349
- mediaType: a.string(),
1350
- byteSize: a.integer(),
1351
- sha256: a.string(),
1352
- sourcePublishedAt: a.string(),
1353
- sourceUpdatedAt: a.string(),
1354
- retrievedAt: a.string(),
1355
- inboundCitationCount: a.integer(),
1356
- outboundCitationCount: a.integer(),
1357
- importRunId: a.id(),
1358
- importedAt: a.datetime(),
1359
- createdAt: a.datetime(),
1360
- curationStatus: a.string(),
1361
- curationStatusKey: a.string(),
1362
- curationStatusUpdatedAt: a.datetime(),
1363
- curationStatusUpdatedBy: a.string(),
1364
- curationStatusReason: a.string(),
1365
- newsroomFeedKey: a.string(),
1366
- reviewedFeedKey: a.string(),
1367
- updatedAt: a.datetime(),
1368
- })
1369
- .secondaryIndexes((index) => [
1370
- index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listReferencesByNewsroomFeedAndCreatedAt"),
1371
- index("newsroomFeedKey").sortKeys(["importedAt"]).queryField("listReferencesByNewsroomFeedAndImportedAt"),
1372
- index("lineageId").sortKeys(["versionNumber"]).queryField("listReferencesByLineageAndVersion"),
1373
- index("corpusId").sortKeys(["externalItemId"]).queryField("listReferencesByCorpusAndExternalItem"),
1374
- index("versionState").sortKeys(["updatedAt"]).queryField("listReferencesByVersionStateAndUpdatedAt"),
1375
- index("importRunId").sortKeys(["externalItemId"]).queryField("listReferencesByImportRunAndExternalItem"),
1376
- index("curationStatus").sortKeys(["curationStatusUpdatedAt"]).queryField("listReferencesByCurationStatusAndUpdatedAt"),
1377
- index("curationStatusKey").sortKeys(["curationStatusUpdatedAt"]).queryField("listReferencesByCurationStatusKeyAndUpdatedAt"),
1378
- index("reviewedFeedKey").sortKeys(["updatedAt"]).queryField("listReferencesByReviewedFeedAndUpdatedAt"),
1379
- ])
1380
- .authorization((allow) => [
1381
- allow.groups(categoryWriteGroups).to(["read"]),
1382
- ]),
1383
- ReferenceAttachment: modelWithoutSubscriptions({
1384
- id: a.id().required(),
1385
- referenceId: a.id().required(),
1386
- referenceLineageId: a.id().required(),
1387
- referenceVersionNumber: a.integer(),
1388
- referenceVersionKey: a.string().required(),
1389
- role: a.string().required(),
1390
- sortKey: a.string().required(),
1391
- storagePath: a.string(),
1392
- sourceUri: a.string(),
1393
- filename: a.string(),
1394
- mediaType: a.string(),
1395
- byteSize: a.integer(),
1396
- sha256: a.string(),
1397
- etag: a.string(),
1398
- importRunId: a.id(),
1399
- importedAt: a.datetime(),
1400
- metadata: a.json(),
1401
- })
1402
- .secondaryIndexes((index) => [
1403
- index("referenceVersionKey").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByReferenceVersionAndSortKey"),
1404
- index("referenceLineageId").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByReferenceLineageAndSortKey"),
1405
- index("storagePath").queryField("referenceAttachmentByStoragePath"),
1406
- index("importRunId").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByImportRunAndSortKey"),
1407
- ])
1408
- .authorization((allow) => [
1409
- allow.groups(categoryWriteGroups).to(["read"]),
1410
- ]),
1411
- SemanticNode: modelWithoutSubscriptions({
1412
- id: a.id().required(),
1413
- lineageId: a.id().required(),
1414
- versionNumber: a.integer().required(),
1415
- previousVersionId: a.id(),
1416
- versionState: a.string().required(),
1417
- versionCreatedAt: a.datetime().required(),
1418
- versionCreatedBy: a.string(),
1419
- changeReason: a.string(),
1420
- contentHash: a.string(),
1421
- nodeKey: a.string().required(),
1422
- nodeKind: a.string().required(),
1423
- corpusId: a.id(),
1424
- categorySetId: a.id(),
1425
- categoryLineageId: a.id(),
1426
- categoryKey: a.string(),
1427
- displayName: a.string(),
1428
- description: a.string(),
1429
- aliases: a.string().array(),
1430
- authorityScore: a.float(),
1431
- authorityRank: a.integer(),
1432
- acceptedReferenceMentionCount: a.integer(),
1433
- distinctSourceKindCount: a.integer(),
1434
- relationCount: a.integer(),
1435
- status: a.string().required(),
1436
- importRunId: a.id(),
1437
- createdAt: a.datetime(),
1438
- newsroomFeedKey: a.string(),
1439
- updatedAt: a.datetime(),
1440
- })
1441
- .secondaryIndexes((index) => [
1442
- index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listSemanticNodesByNewsroomFeedAndCreatedAt"),
1443
- index("lineageId").sortKeys(["versionNumber"]).queryField("listSemanticNodesByLineageAndVersion"),
1444
- index("nodeKey").sortKeys(["versionNumber"]).queryField("listSemanticNodesByNodeKeyAndVersion"),
1445
- index("corpusId").sortKeys(["nodeKey"]).queryField("listSemanticNodesByCorpusAndNodeKey"),
1446
- index("importRunId").sortKeys(["nodeKey"]).queryField("listSemanticNodesByImportRunAndNodeKey"),
1447
- index("versionState").sortKeys(["updatedAt"]).queryField("listSemanticNodesByVersionStateAndUpdatedAt"),
1448
- ])
1449
- .authorization((allow) => [
1450
- allow.groups(categoryWriteGroups).to(["read"]),
1451
- ]),
1452
- Message: realtimeModel({
1453
- id: a.id().required(),
1454
- messageKind: a.string().required(),
1455
- messageDomain: a.string().required(),
1456
- status: a.string().required(),
1457
- summary: a.string(),
1458
- source: a.string(),
1459
- importRunId: a.id(),
1460
- authorSub: a.string(),
1461
- authorUserProfileId: a.id(),
1462
- authorLabel: a.string(),
1463
- threadId: a.id(),
1464
- parentMessageId: a.id(),
1465
- sequenceNumber: a.integer(),
1466
- role: a.string(),
1467
- messageType: a.string(),
1468
- content: a.string(),
1469
- semanticLayer: a.string(),
1470
- searchVisibility: a.string(),
1471
- responseTarget: a.string(),
1472
- responseStatus: a.string(),
1473
- responseOwner: a.string(),
1474
- responseStartedAt: a.datetime(),
1475
- responseCompletedAt: a.datetime(),
1476
- responseError: a.string(),
1477
- metadata: a.json(),
1478
- createdAt: a.datetime().required(),
1479
- updatedAt: a.datetime().required(),
1480
- newsroomFeedKey: a.string(),
1481
- })
1482
- .secondaryIndexes((index) => [
1483
- index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listMessagesByNewsroomFeedAndCreatedAt"),
1484
- index("status").sortKeys(["createdAt"]).queryField("listMessagesByStatusAndCreatedAt"),
1485
- index("messageKind").sortKeys(["createdAt"]).queryField("listMessagesByKindAndCreatedAt"),
1486
- index("messageDomain").sortKeys(["createdAt"]).queryField("listMessagesByDomainAndCreatedAt"),
1487
- index("authorSub").sortKeys(["createdAt"]).queryField("listMessagesByAuthorSubAndCreatedAt"),
1488
- index("authorUserProfileId").sortKeys(["createdAt"]).queryField("listMessagesByAuthorProfileAndCreatedAt"),
1489
- index("importRunId").sortKeys(["createdAt"]).queryField("listMessagesByImportRunAndCreatedAt"),
1490
- index("threadId").sortKeys(["sequenceNumber"]).name("messagesByThreadSequence").queryField("listMessagesByThreadAndSequence"),
1491
- index("threadId").sortKeys(["createdAt"]).name("messagesByThreadCreatedAt").queryField("listMessagesByThreadAndCreatedAt"),
1492
- index("responseTarget").sortKeys(["responseStatus", "createdAt"]).name("messagesByResponseTargetStatusCreatedAt").queryField("listMessagesByResponseTargetStatusAndCreatedAt"),
1493
- index("semanticLayer").sortKeys(["createdAt"]).name("messagesBySemanticLayerCreatedAt").queryField("listMessagesBySemanticLayerAndCreatedAt"),
1494
- index("searchVisibility").sortKeys(["createdAt"]).name("messagesBySearchVisibilityCreatedAt").queryField("listMessagesBySearchVisibilityAndCreatedAt"),
1495
- ])
1496
- .authorization((allow) => [
1497
- allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1498
- ]),
1499
- MessageThread: realtimeModel({
1500
- id: a.id().required(),
1501
- threadKind: a.string().required(),
1502
- status: a.string().required(),
1503
- title: a.string().required(),
1504
- summary: a.string(),
1505
- primaryAnchorKind: a.string(),
1506
- primaryAnchorId: a.id(),
1507
- primaryAnchorLineageId: a.id(),
1508
- primaryAnchorKey: a.string(),
1509
- createdBySub: a.string(),
1510
- createdByUserProfileId: a.id(),
1511
- createdByLabel: a.string(),
1512
- messageCount: a.integer(),
1513
- lastMessageId: a.id(),
1514
- lastMessageAt: a.datetime(),
1515
- contextDigest: a.string(),
1516
- activeResponseMessageId: a.id(),
1517
- responseLockOwner: a.string(),
1518
- responseLockExpiresAt: a.datetime(),
1519
- metadata: a.json(),
1520
- createdAt: a.datetime().required(),
1521
- updatedAt: a.datetime().required(),
1522
- newsroomFeedKey: a.string(),
1523
- })
1524
- .secondaryIndexes((index) => [
1525
- index("newsroomFeedKey").sortKeys(["updatedAt"]).queryField("listMessageThreadsByNewsroomFeedAndUpdatedAt"),
1526
- index("threadKind").sortKeys(["updatedAt"]).queryField("listMessageThreadsByKindAndUpdatedAt"),
1527
- index("status").sortKeys(["updatedAt"]).queryField("listMessageThreadsByStatusAndUpdatedAt"),
1528
- index("primaryAnchorKey").sortKeys(["updatedAt"]).name("messageThreadsByAnchorUpdatedAt").queryField("listMessageThreadsByAnchorAndUpdatedAt"),
1529
- index("createdBySub").sortKeys(["updatedAt"]).queryField("listMessageThreadsByCreatorAndUpdatedAt"),
1530
- ])
1531
- .authorization((allow) => [
1532
- allow.groups(categoryWriteGroups).to(["read", "create", "update"]),
1533
- ]),
1534
- ModelAttachment: modelWithoutSubscriptions({
1535
- id: a.id().required(),
1536
- ownerKind: a.string().required(),
1537
- ownerId: a.id().required(),
1538
- ownerLineageId: a.id(),
1539
- ownerVersionNumber: a.integer(),
1540
- ownerVersionKey: a.string(),
1541
- role: a.string().required(),
1542
- sortKey: a.string().required(),
1543
- storagePath: a.string().required(),
1544
- filename: a.string(),
1545
- mediaType: a.string().required(),
1546
- byteSize: a.integer(),
1547
- sha256: a.string(),
1548
- etag: a.string(),
1549
- importRunId: a.id(),
1550
- createdAt: a.datetime().required(),
1551
- updatedAt: a.datetime(),
1552
- status: a.string().required(),
1553
- })
1554
- .secondaryIndexes((index) => [
1555
- index("ownerId").sortKeys(["role", "sortKey"]).queryField("listModelAttachmentsByOwnerRoleAndSortKey"),
1556
- index("ownerVersionKey").sortKeys(["role", "sortKey"]).queryField("listModelAttachmentsByOwnerVersionRoleAndSortKey"),
1557
- index("storagePath").queryField("modelAttachmentByStoragePath"),
1558
- index("importRunId").sortKeys(["ownerKind", "role"]).queryField("listModelAttachmentsByImportRunKindAndRole"),
1559
- index("role").sortKeys(["status", "createdAt"]).queryField("listModelAttachmentsByRoleStatusAndCreatedAt"),
1560
- ])
1561
- .authorization((allow) => [
1562
- allow.groups(categoryWriteGroups).to(["read"]),
1563
- ]),
1564
- SemanticRelationType: modelWithoutSubscriptions({
1565
- id: a.id().required(),
1566
- key: a.string().required(),
1567
- label: a.string().required(),
1568
- inverseLabel: a.string(),
1569
- description: a.string(),
1570
- domain: a.string().required(),
1571
- status: a.string().required(),
1572
- allowedSubjectKinds: a.string().array(),
1573
- allowedObjectKinds: a.string().array(),
1574
- isDirectional: a.boolean(),
1575
- isSymmetric: a.boolean(),
1576
- isTransitive: a.boolean(),
1577
- contextPackTags: a.string().array(),
1578
- createdAt: a.datetime().required(),
1579
- updatedAt: a.datetime().required(),
1580
- metadata: a.json(),
1581
- })
1582
- .secondaryIndexes((index) => [
1583
- index("key").queryField("semanticRelationTypeByKey"),
1584
- index("domain").sortKeys(["label"]).queryField("listSemanticRelationTypesByDomainAndLabel"),
1585
- index("status").sortKeys(["label"]).queryField("listSemanticRelationTypesByStatusAndLabel"),
1586
- ])
1587
- .authorization((allow) => [
1588
- allow.groups(categoryWriteGroups),
1589
- ]),
1590
- SemanticRelation: modelWithoutSubscriptions({
1591
- id: a.id().required(),
1592
- relationState: a.string().required(),
1593
- predicate: a.string().required(),
1594
- relationTypeId: a.id(),
1595
- relationTypeKey: a.string(),
1596
- relationDomain: a.string(),
1597
- subjectKind: a.string().required(),
1598
- subjectId: a.id().required(),
1599
- subjectLineageId: a.id().required(),
1600
- subjectVersionNumber: a.integer(),
1601
- objectKind: a.string().required(),
1602
- objectId: a.id().required(),
1603
- objectLineageId: a.id().required(),
1604
- objectVersionNumber: a.integer(),
1605
- subjectStateKey: a.string().required(),
1606
- objectStateKey: a.string().required(),
1607
- objectSubjectStateKey: a.string().required(),
1608
- predicateObjectStateKey: a.string().required(),
1609
- subjectVersionKey: a.string().required(),
1610
- objectVersionKey: a.string().required(),
1611
- score: a.float(),
1612
- confidence: a.float(),
1613
- rank: a.integer(),
1614
- classifierId: a.string(),
1615
- modelVersion: a.string(),
1616
- reviewRecommended: a.boolean(),
1617
- sourceSnapshotId: a.string(),
1618
- importRunId: a.id(),
1619
- importedAt: a.datetime(),
1620
- createdAt: a.datetime(),
1621
- updatedAt: a.datetime(),
1622
- newsroomFeedKey: a.string(),
1623
- metadata: a.json(),
1624
- })
1625
- .secondaryIndexes((index) => [
1626
- index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listSemanticRelationsByNewsroomFeedAndCreatedAt"),
1627
- index("subjectStateKey").sortKeys(["predicateObjectStateKey"]).queryField("listSemanticRelationsBySubjectState"),
1628
- index("objectStateKey").sortKeys(["predicate"]).queryField("listSemanticRelationsByObjectState"),
1629
- index("objectSubjectStateKey").sortKeys(["score"]).queryField("listSemanticRelationsByObjectSubjectStateAndScore"),
1630
- index("predicateObjectStateKey").sortKeys(["score"]).queryField("listSemanticRelationsByPredicateObjectStateAndScore"),
1631
- index("subjectVersionKey").sortKeys(["predicateObjectStateKey"]).queryField("listSemanticRelationsBySubjectVersion"),
1632
- index("importRunId").sortKeys(["importedAt"]).queryField("listSemanticRelationsByImportRunAndImportedAt"),
1633
- index("relationTypeKey").sortKeys(["importedAt"]).queryField("listSemanticRelationsByTypeAndImportedAt"),
1634
- index("relationDomain").sortKeys(["importedAt"]).queryField("listSemanticRelationsByDomainAndImportedAt"),
1635
- ])
1636
- .authorization((allow) => [
1637
- allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1638
- ]),
1639
- Item: modelWithoutSubscriptions({
1640
- id: a.id().required(),
1641
- lineageId: a.id().required(),
1642
- tenantId: a.string(),
1643
- versionNumber: a.integer().required(),
1644
- previousVersionId: a.id(),
1645
- versionState: a.string().required(),
1646
- versionCreatedAt: a.datetime().required(),
1647
- versionCreatedBy: a.string(),
1648
- changeReason: a.string(),
1649
- contentHash: a.string(),
1650
- type: a.string().required(),
1651
- stage: a.string(),
1652
- status: a.string().required(),
1653
- typeStatus: a.string().required(),
1654
- slug: a.string().required(),
1655
- tenantSlug: a.string(),
1656
- shortSlug: a.string(),
1657
- section: a.string(),
1658
- sectionStatus: a.string(),
1659
- title: a.string(),
1660
- headline: a.string(),
1661
- deck: a.string(),
1662
- body: a.string().array(),
1663
- bodyMarkus: a.string(),
1664
- bodyIr: a.json(),
1665
- aliases: a.string().array(),
1666
- metadata: a.json(),
1667
- byline: a.string(),
1668
- dateline: a.string(),
1669
- publishedAt: a.datetime(),
1670
- editionDate: a.string(),
1671
- sortTitle: a.string(),
1672
- pullQuotes: a.string().array(),
1673
- layout: a.json(),
1674
- editorial: a.json(),
1675
- updatedAt: a.datetime(),
1676
- tags: a.hasMany("ItemTag", "itemId"),
1677
- mediaAssets: a.hasMany("MediaAsset", "itemId"),
1678
- editionItems: a.hasMany("EditionItem", "itemId"),
1679
- })
1680
- .secondaryIndexes((index) => [
1681
- index("lineageId").sortKeys(["versionNumber"]).queryField("listItemsByLineageAndVersion"),
1682
- index("slug").queryField("itemBySlug"),
1683
- index("tenantSlug").queryField("itemByTenantSlug"),
1684
- index("typeStatus").sortKeys(["publishedAt"]).queryField("listItemsByTypeStatusAndPublishedAt"),
1685
- index("sectionStatus").sortKeys(["publishedAt"]).queryField("listItemsBySectionStatusAndPublishedAt"),
1686
- index("versionState").sortKeys(["updatedAt"]).queryField("listItemsByVersionStateAndUpdatedAt"),
1687
- index("stage").sortKeys(["updatedAt"]).queryField("listItemsByStageAndUpdatedAt"),
1688
- ])
1689
- .authorization((allow) => [
1690
- allow.groups(contentWriteGroups),
1691
- ]),
1692
- Tag: modelWithoutSubscriptions({
1693
- id: a.id().required(),
1694
- slug: a.string().required(),
1695
- label: a.string().required(),
1696
- type: a.string(),
1697
- description: a.string(),
1698
- items: a.hasMany("ItemTag", "tagId"),
1699
- })
1700
- .secondaryIndexes((index) => [
1701
- index("slug").queryField("tagBySlug"),
1702
- index("type").sortKeys(["label"]).queryField("listTagsByTypeAndLabel"),
1703
- ])
1704
- .authorization((allow) => [
1705
- allow.groups(contentWriteGroups),
1706
- ]),
1707
- ItemTag: modelWithoutSubscriptions({
1708
- id: a.id().required(),
1709
- itemId: a.id().required(),
1710
- tagId: a.id().required(),
1711
- itemType: a.string().required(),
1712
- itemStatus: a.string().required(),
1713
- tagSlug: a.string().required(),
1714
- publishedAt: a.datetime(),
1715
- item: a.belongsTo("Item", "itemId"),
1716
- tag: a.belongsTo("Tag", "tagId"),
1717
- })
1718
- .secondaryIndexes((index) => [
1719
- index("itemId").sortKeys(["tagSlug"]).queryField("listItemTagsByItemAndTag"),
1720
- index("tagId").sortKeys(["publishedAt"]).queryField("listItemTagsByTagAndPublishedAt"),
1721
- ])
1722
- .authorization((allow) => [
1723
- allow.groups(contentWriteGroups),
1724
- ]),
1725
- MediaAsset: modelWithoutSubscriptions({
1726
- id: a.id().required(),
1727
- itemId: a.id().required(),
1728
- tenantId: a.string(),
1729
- type: a.string().required(),
1730
- role: a.string().required(),
1731
- sortKey: a.string().required(),
1732
- storagePath: a.string(),
1733
- externalUrl: a.string(),
1734
- alt: a.string().required(),
1735
- caption: a.string(),
1736
- credit: a.string(),
1737
- width: a.integer(),
1738
- height: a.integer(),
1739
- aspectRatio: a.float(),
1740
- focalX: a.float(),
1741
- focalY: a.float(),
1742
- minHeight: a.integer(),
1743
- preferredHeight: a.integer(),
1744
- maxHeight: a.integer(),
1745
- crop: a.string(),
1746
- wrapsText: a.boolean(),
1747
- metadata: a.json(),
1748
- item: a.belongsTo("Item", "itemId"),
1749
- })
1750
- .secondaryIndexes((index) => [
1751
- index("itemId").sortKeys(["sortKey"]).queryField("listMediaAssetsByItemAndSortKey"),
1752
- index("role").sortKeys(["itemId"]).queryField("listMediaAssetsByRoleAndItem"),
1753
- ])
1754
- .authorization((allow) => [
1755
- allow.groups(contentWriteGroups),
1756
- ]),
1757
- Edition: modelWithoutSubscriptions({
1758
- id: a.id().required(),
1759
- lineageId: a.id().required(),
1760
- versionNumber: a.integer().required(),
1761
- previousVersionId: a.id(),
1762
- versionState: a.string().required(),
1763
- versionCreatedAt: a.datetime().required(),
1764
- versionCreatedBy: a.string(),
1765
- changeReason: a.string(),
1766
- contentHash: a.string(),
1767
- slug: a.string().required(),
1768
- title: a.string().required(),
1769
- status: a.string().required(),
1770
- editionDate: a.string().required(),
1771
- publishedAt: a.datetime(),
1772
- description: a.string(),
1773
- layoutPlan: a.json(),
1774
- metadata: a.json(),
1775
- items: a.hasMany("EditionItem", "editionId"),
1776
- })
1777
- .secondaryIndexes((index) => [
1778
- index("lineageId").sortKeys(["versionNumber"]).queryField("listEditionsByLineageAndVersion"),
1779
- index("slug").queryField("editionBySlug"),
1780
- index("status").sortKeys(["editionDate"]).queryField("listEditionsByStatusAndEditionDate"),
1781
- index("status").sortKeys(["publishedAt"]).queryField("listEditionsByStatusAndPublishedAt"),
1782
- index("versionState").sortKeys(["publishedAt"]).queryField("listEditionsByVersionStateAndPublishedAt"),
1783
- ])
1784
- .authorization((allow) => [
1785
- allow.groups(contentWriteGroups),
1786
- ]),
1787
- EditionItem: modelWithoutSubscriptions({
1788
- id: a.id().required(),
1789
- editionId: a.id().required(),
1790
- editionLineageId: a.id(),
1791
- itemId: a.id().required(),
1792
- itemLineageId: a.id(),
1793
- placementKey: a.string().required(),
1794
- sortKey: a.string().required(),
1795
- pageNumber: a.integer(),
1796
- priority: a.integer(),
1797
- metadata: a.json(),
1798
- edition: a.belongsTo("Edition", "editionId"),
1799
- item: a.belongsTo("Item", "itemId"),
1800
- })
1801
- .secondaryIndexes((index) => [
1802
- index("editionId").sortKeys(["sortKey"]).queryField("listEditionItemsByEditionAndSortKey"),
1803
- index("itemId").sortKeys(["editionId"]).queryField("listEditionItemsByItemAndEdition"),
1804
- ])
1805
- .authorization((allow) => [
1806
- allow.groups(contentWriteGroups),
1807
- ]),
1808
- PublishedItem: modelWithoutSubscriptions({
1809
- id: a.id().required(),
1810
- sourceItemId: a.id().required(),
1811
- itemLineageId: a.id().required(),
1812
- tenantId: a.string(),
1813
- versionNumber: a.integer().required(),
1814
- type: a.string().required(),
1815
- status: a.string().required(),
1816
- typeStatus: a.string().required(),
1817
- slug: a.string().required(),
1818
- tenantSlug: a.string(),
1819
- shortSlug: a.string(),
1820
- section: a.string(),
1821
- sectionStatus: a.string(),
1822
- title: a.string(),
1823
- headline: a.string(),
1824
- deck: a.string(),
1825
- body: a.string().array(),
1826
- bodyMarkus: a.string(),
1827
- bodyIr: a.json(),
1828
- aliases: a.string().array(),
1829
- metadata: a.json(),
1830
- byline: a.string(),
1831
- dateline: a.string(),
1832
- publishedAt: a.datetime(),
1833
- editionDate: a.string(),
1834
- sortTitle: a.string(),
1835
- pullQuotes: a.string().array(),
1836
- layout: a.json(),
1837
- editorial: a.json(),
1838
- })
1839
- .secondaryIndexes((index) => [
1840
- index("slug").queryField("publishedItemBySlug"),
1841
- index("tenantSlug").queryField("publishedItemByTenantSlug"),
1842
- index("typeStatus").sortKeys(["publishedAt"]).queryField("listPublishedItemsByTypeStatusAndPublishedAt"),
1843
- index("sectionStatus").sortKeys(["publishedAt"]).queryField("listPublishedItemsBySectionStatusAndPublishedAt"),
1844
- index("itemLineageId").sortKeys(["versionNumber"]).queryField("listPublishedItemsByLineageAndVersion"),
1845
- ])
1846
- .authorization((allow) => [
1847
- allow.guest().to(["read"]),
1848
- allow.groups(contentWriteGroups),
1849
- ]),
1850
- PublishedMediaAsset: modelWithoutSubscriptions({
1851
- id: a.id().required(),
1852
- sourceMediaAssetId: a.id().required(),
1853
- tenantId: a.string(),
1854
- publishedItemId: a.id().required(),
1855
- sourceItemId: a.id().required(),
1856
- itemLineageId: a.id().required(),
1857
- type: a.string().required(),
1858
- role: a.string().required(),
1859
- sortKey: a.string().required(),
1860
- storagePath: a.string(),
1861
- externalUrl: a.string(),
1862
- alt: a.string().required(),
1863
- caption: a.string(),
1864
- credit: a.string(),
1865
- width: a.integer(),
1866
- height: a.integer(),
1867
- aspectRatio: a.float(),
1868
- focalX: a.float(),
1869
- focalY: a.float(),
1870
- minHeight: a.integer(),
1871
- preferredHeight: a.integer(),
1872
- maxHeight: a.integer(),
1873
- crop: a.string(),
1874
- wrapsText: a.boolean(),
1875
- metadata: a.json(),
1876
- })
1877
- .secondaryIndexes((index) => [
1878
- index("publishedItemId").sortKeys(["sortKey"]).queryField("listPublishedMediaAssetsByItemAndSortKey"),
1879
- index("role").sortKeys(["publishedItemId"]).queryField("listPublishedMediaAssetsByRoleAndItem"),
1880
- ])
1881
- .authorization((allow) => [
1882
- allow.guest().to(["read"]),
1883
- allow.groups(contentWriteGroups),
1884
- ]),
1885
- PublishedEdition: modelWithoutSubscriptions({
1886
- id: a.id().required(),
1887
- sourceEditionId: a.id().required(),
1888
- editionLineageId: a.id().required(),
1889
- versionNumber: a.integer().required(),
1890
- slug: a.string().required(),
1891
- title: a.string().required(),
1892
- status: a.string().required(),
1893
- editionDate: a.string().required(),
1894
- publishedAt: a.datetime(),
1895
- description: a.string(),
1896
- layoutPlan: a.json(),
1897
- metadata: a.json(),
1898
- })
1899
- .secondaryIndexes((index) => [
1900
- index("slug").queryField("publishedEditionBySlug"),
1901
- index("status").sortKeys(["editionDate"]).queryField("listPublishedEditionsByStatusAndEditionDate"),
1902
- index("status").sortKeys(["publishedAt"]).queryField("listPublishedEditionsByStatusAndPublishedAt"),
1903
- index("editionLineageId").sortKeys(["versionNumber"]).queryField("listPublishedEditionsByLineageAndVersion"),
1904
- ])
1905
- .authorization((allow) => [
1906
- allow.guest().to(["read"]),
1907
- allow.groups(contentWriteGroups),
1908
- ]),
1909
- PublishedEditionItem: modelWithoutSubscriptions({
1910
- id: a.id().required(),
1911
- publishedEditionId: a.id().required(),
1912
- publishedItemId: a.id().required(),
1913
- sourceEditionItemId: a.id().required(),
1914
- sourceEditionId: a.id().required(),
1915
- sourceItemId: a.id().required(),
1916
- editionLineageId: a.id().required(),
1917
- itemLineageId: a.id().required(),
1918
- placementKey: a.string().required(),
1919
- sortKey: a.string().required(),
1920
- pageNumber: a.integer(),
1921
- priority: a.integer(),
1922
- metadata: a.json(),
1923
- })
1924
- .secondaryIndexes((index) => [
1925
- index("publishedEditionId").sortKeys(["sortKey"]).queryField("listPublishedEditionItemsByEditionAndSortKey"),
1926
- index("publishedItemId").sortKeys(["publishedEditionId"]).queryField("listPublishedEditionItemsByItemAndEdition"),
1927
- ])
1928
- .authorization((allow) => [
1929
- allow.guest().to(["read"]),
1930
- allow.groups(contentWriteGroups),
1931
- ]),
1932
- PublishedCategorySet: modelWithoutSubscriptions({
1933
- id: a.id().required(),
1934
- sourceCategorySetId: a.id().required(),
1935
- categorySetLineageId: a.id().required(),
1936
- versionNumber: a.integer().required(),
1937
- corpusId: a.id().required(),
1938
- classifierId: a.string().required(),
1939
- displayName: a.string().required(),
1940
- description: a.string(),
1941
- status: a.string().required(),
1942
- generatedAt: a.datetime(),
1943
- publishedAt: a.datetime(),
1944
- categoryCount: a.integer(),
1945
- metadata: a.json(),
1946
- })
1947
- .secondaryIndexes((index) => [
1948
- index("status").sortKeys(["displayName"]).queryField("listPublishedCategorySetsByStatusAndName"),
1949
- index("classifierId").sortKeys(["displayName"]).queryField("listPublishedCategorySetsByClassifierAndName"),
1950
- index("categorySetLineageId").sortKeys(["versionNumber"]).queryField("listPublishedCategorySetsByLineageAndVersion"),
1951
- ])
1952
- .authorization((allow) => [
1953
- allow.guest().to(["read"]),
1954
- allow.groups(contentWriteGroups),
1955
- ]),
1956
- PublishedCategory: modelWithoutSubscriptions({
1957
- id: a.id().required(),
1958
- sourceCategoryId: a.id().required(),
1959
- publishedCategorySetId: a.id().required(),
1960
- categoryLineageId: a.id().required(),
1961
- categorySetLineageId: a.id().required(),
1962
- versionNumber: a.integer().required(),
1963
- corpusId: a.id().required(),
1964
- categoryKey: a.string().required(),
1965
- parentCategoryId: a.id(),
1966
- parentCategoryKey: a.string(),
1967
- displayName: a.string().required(),
1968
- shortTitle: a.string(),
1969
- subtitle: a.string(),
1970
- description: a.string(),
1971
- aliases: a.string().array(),
1972
- status: a.string().required(),
1973
- seedItemIds: a.string().array(),
1974
- holdoutItemIds: a.string().array(),
1975
- rank: a.integer(),
1976
- depth: a.integer(),
1977
- isPinned: a.boolean(),
1978
- metadata: a.json(),
1979
- })
1980
- .secondaryIndexes((index) => [
1981
- index("publishedCategorySetId").sortKeys(["categoryKey"]).queryField("listPublishedCategoriesBySetAndKey"),
1982
- index("parentCategoryId").sortKeys(["rank"]).queryField("listPublishedCategoriesByParentAndRank"),
1983
- index("parentCategoryKey").sortKeys(["rank"]).queryField("listPublishedCategoriesByParentKeyAndRank"),
1984
- index("categoryKey").sortKeys(["publishedCategorySetId"]).queryField("listPublishedCategoriesByKeyAndSet"),
1985
- ])
1986
- .authorization((allow) => [
1987
- allow.guest().to(["read"]),
1988
- allow.groups(contentWriteGroups),
1989
- ]),
28
+ /**
29
+ * Model groups a site may leave out of its data API. CloudFormation creates at most 2,500 resources in one stack
30
+ * operation, nested stacks included, and the full model set exceeds that on a fresh create. A first deploy that
31
+ * excludes a group fits; a second deploy without the exclusion adds the models as an ordinary update.
32
+ */
33
+ export const OPTIONAL_MODEL_GROUPS = {
34
+ editions: ["Edition", "EditionItem", "PublishedEdition", "PublishedEditionItem"],
1990
35
  };
1991
- export const schema = a.schema(baseDefinitions).authorization((allow) => [
1992
- allow.resource(assignmentAction).to(["query", "mutate"]),
1993
- allow.resource(categoryAction),
1994
- allow.resource(contentActions),
1995
- allow.resource(manageUserRole),
1996
- allow.resource(modelAttachmentUpload),
1997
- allow.resource(newsroomSummary),
1998
- allow.resource(procedureAction),
1999
- ]);
2000
- /** The deployed schema of a site that enables plugins: the base definitions plus what each plugin contributes (docs/plugins.md). */
2001
- export function schemaWithPlugins(pluginDefinitions) {
2002
- return a.schema({ ...baseDefinitions, ...pluginDefinitions }).authorization((allow) => [
36
+ export function assertKnownModelGroups(groups) {
37
+ for (const group of groups) {
38
+ if (!(group in OPTIONAL_MODEL_GROUPS)) {
39
+ throw new Error(`Unknown model group "${group}"; known groups: ${Object.keys(OPTIONAL_MODEL_GROUPS).join(", ")}`);
40
+ }
41
+ }
42
+ }
43
+ function buildBaseDefinitions(includeEditions) {
44
+ const definitions = {
45
+ UserProfile: modelWithoutSubscriptions({
46
+ id: a.id().required(),
47
+ email: a.email(),
48
+ displayName: a.string(),
49
+ avatarUrl: a.url(),
50
+ preferences: a.json(),
51
+ settings: a.json(),
52
+ status: a.string(),
53
+ mergedIntoProfileId: a.id(),
54
+ mergedAt: a.datetime(),
55
+ mergedBy: a.string(),
56
+ mergeReason: a.string(),
57
+ createdAt: a.datetime(),
58
+ updatedAt: a.datetime(),
59
+ })
60
+ .authorization((allow) => [
61
+ allow.owner(),
62
+ allow.group(adminGroup),
63
+ ]),
64
+ UserIdentity: modelWithoutSubscriptions({
65
+ id: a.id().required(),
66
+ userProfileId: a.id().required(),
67
+ cognitoSub: a.string().required(),
68
+ provider: a.string(),
69
+ email: a.email(),
70
+ status: a.string().required(),
71
+ linkedAt: a.datetime().required(),
72
+ lastSeenAt: a.datetime(),
73
+ })
74
+ .secondaryIndexes((index) => [
75
+ index("userProfileId").sortKeys(["linkedAt"]).queryField("listUserIdentitiesByProfileAndLinkedAt"),
76
+ index("cognitoSub").queryField("userIdentityByCognitoSub"),
77
+ index("email").sortKeys(["status"]).queryField("listUserIdentitiesByEmailAndStatus"),
78
+ ])
79
+ .authorization((allow) => [
80
+ allow.group(adminGroup),
81
+ ]),
82
+ UserRoleAssignment: modelWithoutSubscriptions({
83
+ id: a.id().required(),
84
+ userProfileId: a.id().required(),
85
+ userSub: a.string(),
86
+ email: a.email(),
87
+ role: a.string().required(),
88
+ status: a.string().required(),
89
+ grantedBy: a.string().required(),
90
+ grantedAt: a.datetime().required(),
91
+ revokedAt: a.datetime(),
92
+ notes: a.string(),
93
+ })
94
+ .secondaryIndexes((index) => [
95
+ index("userProfileId").sortKeys(["role"]).queryField("listUserRoleAssignmentsByProfileAndRole"),
96
+ index("userSub").sortKeys(["role"]).queryField("listUserRoleAssignmentsByUserAndRole"),
97
+ index("role").sortKeys(["status"]).queryField("listUserRoleAssignmentsByRoleAndStatus"),
98
+ ])
99
+ .authorization((allow) => [
100
+ allow.group(adminGroup),
101
+ ]),
102
+ UserRoleMutationResult: a.customType({
103
+ ok: a.boolean().required(),
104
+ userProfileId: a.id(),
105
+ userSub: a.string(),
106
+ username: a.string(),
107
+ role: a.string().required(),
108
+ userSubs: a.string().array(),
109
+ usernames: a.string().array(),
110
+ activeRoles: a.string().array().required(),
111
+ }),
112
+ UserDirectoryIdentity: a.customType({
113
+ id: a.id().required(),
114
+ userProfileId: a.id().required(),
115
+ cognitoSub: a.string().required(),
116
+ provider: a.string(),
117
+ email: a.email(),
118
+ status: a.string().required(),
119
+ linkedAt: a.datetime().required(),
120
+ lastSeenAt: a.datetime(),
121
+ }),
122
+ UserDirectoryEntry: a.customType({
123
+ userProfileId: a.id(),
124
+ userSub: a.string(),
125
+ username: a.string(),
126
+ email: a.email(),
127
+ displayName: a.string(),
128
+ provider: a.string(),
129
+ enabled: a.boolean(),
130
+ cognitoStatus: a.string(),
131
+ profileStatus: a.string(),
132
+ mergedIntoProfileId: a.id(),
133
+ identityStatus: a.string(),
134
+ activeRoles: a.string().array().required(),
135
+ identities: a.ref("UserDirectoryIdentity").array().required(),
136
+ }),
137
+ UserDirectoryResult: a.customType({
138
+ entries: a.ref("UserDirectoryEntry").array().required(),
139
+ profileCount: a.integer().required(),
140
+ identityCount: a.integer().required(),
141
+ cognitoUserCount: a.integer().required(),
142
+ }),
143
+ ReaderSettingsResult: a.customType({
144
+ userProfileId: a.id().required(),
145
+ settings: a.json(),
146
+ }),
147
+ listUserDirectory: a
148
+ .query()
149
+ .returns(a.ref("UserDirectoryResult"))
150
+ .authorization((allow) => [allow.group(adminGroup)])
151
+ .handler(functionHandler("manageUserRole", manageUserRole)),
152
+ grantUserRole: a
153
+ .mutation()
154
+ .arguments({
155
+ userProfileId: a.id(),
156
+ userSub: a.string(),
157
+ cognitoSubs: a.string().array(),
158
+ role: a.string().required(),
159
+ })
160
+ .returns(a.ref("UserRoleMutationResult"))
161
+ .authorization((allow) => [allow.group(adminGroup)])
162
+ .handler(functionHandler("manageUserRole", manageUserRole)),
163
+ revokeUserRole: a
164
+ .mutation()
165
+ .arguments({
166
+ userProfileId: a.id(),
167
+ userSub: a.string(),
168
+ cognitoSubs: a.string().array(),
169
+ role: a.string().required(),
170
+ })
171
+ .returns(a.ref("UserRoleMutationResult"))
172
+ .authorization((allow) => [allow.group(adminGroup)])
173
+ .handler(functionHandler("manageUserRole", manageUserRole)),
174
+ mergeUserProfiles: a
175
+ .mutation()
176
+ .arguments({
177
+ targetUserProfileId: a.id(),
178
+ targetUserSub: a.string(),
179
+ sourceUserProfileId: a.id(),
180
+ sourceUserSub: a.string(),
181
+ reason: a.string(),
182
+ })
183
+ .returns(a.ref("UserDirectoryEntry"))
184
+ .authorization((allow) => [allow.group(adminGroup)])
185
+ .handler(functionHandler("manageUserRole", manageUserRole)),
186
+ getReaderSettings: a
187
+ .query()
188
+ .returns(a.ref("ReaderSettingsResult"))
189
+ .authorization((allow) => [allow.authenticated()])
190
+ .handler(functionHandler("readerSettings", readerSettings)),
191
+ updateReaderSettings: a
192
+ .mutation()
193
+ .arguments({
194
+ settings: a.json().required(),
195
+ })
196
+ .returns(a.ref("ReaderSettingsResult"))
197
+ .authorization((allow) => [allow.authenticated()])
198
+ .handler(functionHandler("readerSettings", readerSettings)),
199
+ SteeringActionResult: a.customType({
200
+ ok: a.boolean().required(),
201
+ action: a.string().required(),
202
+ proposalId: a.id(),
203
+ categorySetId: a.id(),
204
+ categoryId: a.id(),
205
+ decisionId: a.id(),
206
+ status: a.string(),
207
+ }),
208
+ reviewSteeringProposal: a
209
+ .mutation()
210
+ .arguments({
211
+ proposalId: a.id().required(),
212
+ action: a.string().required(),
213
+ actorSub: a.string(),
214
+ actorLabel: a.string(),
215
+ note: a.string(),
216
+ displayName: a.string(),
217
+ shortTitle: a.string(),
218
+ subtitle: a.string(),
219
+ description: a.string(),
220
+ aliases: a.string().array(),
221
+ seedItemIds: a.string().array(),
222
+ holdoutItemIds: a.string().array(),
223
+ })
224
+ .returns(a.ref("SteeringActionResult"))
225
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
226
+ .handler(functionHandler("categoryAction", categoryAction)),
227
+ CurationDelegationResult: a.customType({
228
+ ok: a.boolean().required(),
229
+ delegationId: a.id().required(),
230
+ token: a.string(),
231
+ agentLabel: a.string().required(),
232
+ grantorLabel: a.string(),
233
+ expiresAt: a.datetime().required(),
234
+ revokedAt: a.datetime(),
235
+ state: a.string(),
236
+ userCode: a.string(),
237
+ requestedHours: a.integer(),
238
+ pendingExpiresAt: a.datetime(),
239
+ approvedAt: a.datetime(),
240
+ deniedAt: a.datetime(),
241
+ }),
242
+ CurationDelegationRequestResult: a.customType({
243
+ ok: a.boolean().required(),
244
+ delegationId: a.id().required(),
245
+ userCode: a.string().required(),
246
+ pendingExpiresAt: a.datetime().required(),
247
+ requestedHours: a.integer().required(),
248
+ }),
249
+ CurationDelegationStatusResult: a.customType({
250
+ delegationId: a.id().required(),
251
+ state: a.string().required(),
252
+ expiresAt: a.datetime().required(),
253
+ grantorLabel: a.string(),
254
+ }),
255
+ ReferenceCurationActionResult: a.customType({
256
+ ok: a.boolean().required(),
257
+ action: a.string().required(),
258
+ referenceId: a.id().required(),
259
+ status: a.string().required(),
260
+ reasonCode: a.string(),
261
+ messageId: a.id(),
262
+ relationId: a.id(),
263
+ }),
264
+ ReferenceQualityActionResult: a.customType({
265
+ ok: a.boolean().required(),
266
+ referenceId: a.id().required(),
267
+ rating: a.integer().required(),
268
+ status: a.string().required(),
269
+ relationId: a.id(),
270
+ }),
271
+ CategorySetDraftActionResult: a.customType({
272
+ ok: a.boolean().required(),
273
+ action: a.string().required(),
274
+ categorySetId: a.id().required(),
275
+ sourceCategorySetId: a.id(),
276
+ categoryCount: a.integer(),
277
+ status: a.string(),
278
+ }),
279
+ TopicLabelActionResult: a.customType({
280
+ ok: a.boolean().required(),
281
+ action: a.string().required(),
282
+ referenceId: a.id(),
283
+ categoryId: a.id(),
284
+ relationId: a.id(),
285
+ sourceRelationId: a.id(),
286
+ status: a.string(),
287
+ }),
288
+ reviewReferenceCuration: a
289
+ .mutation()
290
+ .arguments({
291
+ referenceId: a.id().required(),
292
+ action: a.string().required(),
293
+ actorSub: a.string(),
294
+ actorLabel: a.string(),
295
+ note: a.string(),
296
+ reasonCode: a.string(),
297
+ decisionRelationId: a.id(),
298
+ shareable: a.boolean(),
299
+ sectionId: a.id(),
300
+ })
301
+ .returns(a.ref("ReferenceCurationActionResult"))
302
+ .authorization((allow) => [
303
+ allow.groups(categoryWriteGroups),
304
+ ])
305
+ .handler(functionHandler("categoryAction", categoryAction)),
306
+ createCurationDelegation: a
307
+ .mutation()
308
+ .arguments({
309
+ agentLabel: a.string().required(),
310
+ hours: a.integer(),
311
+ })
312
+ .returns(a.ref("CurationDelegationResult"))
313
+ .authorization((allow) => [
314
+ allow.groups(categoryWriteGroups),
315
+ ])
316
+ .handler(functionHandler("categoryAction", categoryAction)),
317
+ revokeCurationDelegation: a
318
+ .mutation()
319
+ .arguments({
320
+ delegationId: a.id().required(),
321
+ })
322
+ .returns(a.ref("CurationDelegationResult"))
323
+ .authorization((allow) => [
324
+ allow.groups(categoryWriteGroups),
325
+ ])
326
+ .handler(functionHandler("categoryAction", categoryAction)),
327
+ listCurationDelegations: a
328
+ .query()
329
+ .returns(a.ref("CurationDelegationResult").array())
330
+ .authorization((allow) => [
331
+ allow.groups(categoryWriteGroups),
332
+ ])
333
+ .handler(functionHandler("categoryAction", categoryAction)),
334
+ requestCurationDelegation: a
335
+ .mutation()
336
+ .arguments({
337
+ delegationId: a.id().required(),
338
+ tokenHash: a.string().required(),
339
+ agentLabel: a.string().required(),
340
+ hours: a.integer(),
341
+ })
342
+ .returns(a.ref("CurationDelegationRequestResult"))
343
+ .authorization((allow) => [
344
+ allow.authenticated("identityPool"),
345
+ ])
346
+ .handler(functionHandler("categoryAction", categoryAction)),
347
+ approveCurationDelegation: a
348
+ .mutation()
349
+ .arguments({
350
+ userCode: a.string().required(),
351
+ })
352
+ .returns(a.ref("CurationDelegationResult"))
353
+ .authorization((allow) => [
354
+ allow.groups(categoryWriteGroups),
355
+ ])
356
+ .handler(functionHandler("categoryAction", categoryAction)),
357
+ denyCurationDelegation: a
358
+ .mutation()
359
+ .arguments({
360
+ userCode: a.string().required(),
361
+ })
362
+ .returns(a.ref("CurationDelegationResult"))
363
+ .authorization((allow) => [
364
+ allow.groups(categoryWriteGroups),
365
+ ])
366
+ .handler(functionHandler("categoryAction", categoryAction)),
367
+ getCurationDelegationStatus: a
368
+ .query()
369
+ .arguments({
370
+ delegationId: a.id().required(),
371
+ })
372
+ .returns(a.ref("CurationDelegationStatusResult"))
373
+ .authorization((allow) => [
374
+ allow.authenticated("identityPool"),
375
+ ])
376
+ .handler(functionHandler("categoryAction", categoryAction)),
377
+ recordDelegatedCuration: a
378
+ .mutation()
379
+ .arguments({
380
+ referenceId: a.id().required(),
381
+ action: a.string().required(),
382
+ delegationId: a.id().required(),
383
+ delegationToken: a.string().required(),
384
+ agentLabel: a.string().required(),
385
+ onBehalfOf: a.string().required(),
386
+ instruction: a.string().required(),
387
+ note: a.string(),
388
+ reasonCode: a.string(),
389
+ decisionRelationId: a.id(),
390
+ shareable: a.boolean(),
391
+ sectionId: a.id(),
392
+ })
393
+ .returns(a.ref("ReferenceCurationActionResult"))
394
+ .authorization((allow) => [
395
+ allow.authenticated("identityPool"),
396
+ ])
397
+ .handler(functionHandler("categoryAction", categoryAction)),
398
+ setReferenceQualityRating: a
399
+ .mutation()
400
+ .arguments({
401
+ referenceId: a.id().required(),
402
+ rating: a.integer().required(),
403
+ actorSub: a.string(),
404
+ actorLabel: a.string(),
405
+ note: a.string(),
406
+ })
407
+ .returns(a.ref("ReferenceQualityActionResult"))
408
+ .authorization((allow) => [
409
+ allow.groups(categoryWriteGroups),
410
+ ])
411
+ .handler(functionHandler("categoryAction", categoryAction)),
412
+ createCategorySetDraft: a
413
+ .mutation()
414
+ .arguments({
415
+ sourceCategorySetId: a.id().required(),
416
+ displayName: a.string(),
417
+ actorLabel: a.string(),
418
+ note: a.string(),
419
+ })
420
+ .returns(a.ref("CategorySetDraftActionResult"))
421
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
422
+ .handler(functionHandler("categoryAction", categoryAction)),
423
+ promoteCategorySetDraft: a
424
+ .mutation()
425
+ .arguments({
426
+ categorySetId: a.id().required(),
427
+ actorLabel: a.string(),
428
+ note: a.string(),
429
+ })
430
+ .returns(a.ref("CategorySetDraftActionResult"))
431
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
432
+ .handler(functionHandler("categoryAction", categoryAction)),
433
+ discardCategorySetDraft: a
434
+ .mutation()
435
+ .arguments({
436
+ categorySetId: a.id().required(),
437
+ actorLabel: a.string(),
438
+ note: a.string(),
439
+ })
440
+ .returns(a.ref("CategorySetDraftActionResult"))
441
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
442
+ .handler(functionHandler("categoryAction", categoryAction)),
443
+ createDraftCategory: a
444
+ .mutation()
445
+ .arguments({
446
+ categorySetId: a.id().required(),
447
+ parentCategoryKey: a.string(),
448
+ displayName: a.string().required(),
449
+ shortTitle: a.string(),
450
+ subtitle: a.string(),
451
+ description: a.string(),
452
+ actorLabel: a.string(),
453
+ note: a.string(),
454
+ })
455
+ .returns(a.ref("SteeringActionResult"))
456
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
457
+ .handler(functionHandler("categoryAction", categoryAction)),
458
+ updateDraftCategory: a
459
+ .mutation()
460
+ .arguments({
461
+ categoryId: a.id().required(),
462
+ displayName: a.string(),
463
+ shortTitle: a.string(),
464
+ subtitle: a.string(),
465
+ description: a.string(),
466
+ parentCategoryKey: a.string(),
467
+ actorLabel: a.string(),
468
+ note: a.string(),
469
+ })
470
+ .returns(a.ref("SteeringActionResult"))
471
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
472
+ .handler(functionHandler("categoryAction", categoryAction)),
473
+ archiveDraftCategory: a
474
+ .mutation()
475
+ .arguments({
476
+ categoryId: a.id().required(),
477
+ actorLabel: a.string(),
478
+ note: a.string(),
479
+ })
480
+ .returns(a.ref("SteeringActionResult"))
481
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
482
+ .handler(functionHandler("categoryAction", categoryAction)),
483
+ reviewReferenceTopicLabel: a
484
+ .mutation()
485
+ .arguments({
486
+ referenceId: a.id().required(),
487
+ categoryId: a.id().required(),
488
+ action: a.string().required(),
489
+ sourceRelationId: a.id(),
490
+ actorLabel: a.string(),
491
+ note: a.string(),
492
+ })
493
+ .returns(a.ref("TopicLabelActionResult"))
494
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
495
+ .handler(functionHandler("categoryAction", categoryAction)),
496
+ NewsroomSummary: a.customType({
497
+ generatedAt: a.datetime().required(),
498
+ staleAt: a.datetime(),
499
+ source: a.string(),
500
+ latestImportRun: a.json(),
501
+ counts: a.json().required(),
502
+ facets: a.json(),
503
+ assignmentStatusCounts: a.json().required(),
504
+ assignmentTypeCounts: a.json().required(),
505
+ referenceStatusCounts: a.json().required(),
506
+ messageKindCounts: a.json().required(),
507
+ messageDomainCounts: a.json().required(),
508
+ }),
509
+ getNewsroomSummary: a
510
+ .query()
511
+ .returns(a.ref("NewsroomSummary"))
512
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
513
+ .handler(functionHandler("newsroomSummary", newsroomSummary)),
514
+ deriveMarkus: a
515
+ .query()
516
+ .arguments({ input: a.json().required() })
517
+ .returns(a.json())
518
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
519
+ .handler(functionHandler("contentActions", contentActions)),
520
+ intakePendingReferences: a
521
+ .mutation()
522
+ .arguments({ input: a.json().required() })
523
+ .returns(a.json())
524
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
525
+ .handler(functionHandler("contentActions", contentActions)),
526
+ saveItemDraft: a
527
+ .mutation()
528
+ .arguments({ input: a.json().required() })
529
+ .returns(a.json())
530
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
531
+ .handler(functionHandler("contentActions", contentActions)),
532
+ publishItem: a
533
+ .mutation()
534
+ .arguments({ input: a.json().required() })
535
+ .returns(a.json())
536
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
537
+ .handler(functionHandler("contentActions", contentActions)),
538
+ moveStoryStage: a
539
+ .mutation()
540
+ .arguments({ input: a.json().required() })
541
+ .returns(a.json())
542
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
543
+ .handler(functionHandler("contentActions", contentActions)),
544
+ unpublishItem: a
545
+ .mutation()
546
+ .arguments({ input: a.json().required() })
547
+ .returns(a.json())
548
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
549
+ .handler(functionHandler("contentActions", contentActions)),
550
+ requestStagingBuild: a
551
+ .mutation()
552
+ .arguments({ input: a.json().required() })
553
+ .returns(a.json())
554
+ .authorization((allow) => [allow.groups(contentWriteGroups)])
555
+ .handler(functionHandler("contentActions", contentActions)),
556
+ knowledgeQuery: a
557
+ .query()
558
+ .arguments({
559
+ input: a.json().required(),
560
+ })
561
+ .returns(a.json())
562
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
563
+ .handler(functionHandler("knowledgeQuery", knowledgeQuery)),
564
+ updateNewsroomSummary: a
565
+ .mutation()
566
+ .arguments({
567
+ delta: a.json().required(),
568
+ actorLabel: a.string(),
569
+ reason: a.string(),
570
+ })
571
+ .returns(a.ref("NewsroomSummary"))
572
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
573
+ .handler(functionHandler("newsroomSummary", newsroomSummary)),
574
+ ModelAttachmentUploadSlot: a.customType({
575
+ ok: a.boolean().required(),
576
+ uploadId: a.string().required(),
577
+ attachmentId: a.id().required(),
578
+ ownerKind: a.string().required(),
579
+ ownerId: a.id().required(),
580
+ role: a.string().required(),
581
+ sortKey: a.string().required(),
582
+ method: a.string().required(),
583
+ uploadUrl: a.string().required(),
584
+ storagePath: a.string().required(),
585
+ mediaType: a.string().required(),
586
+ byteSize: a.integer().required(),
587
+ sha256: a.string(),
588
+ expiresAt: a.datetime().required(),
589
+ requiredHeaders: a.json(),
590
+ }),
591
+ ModelAttachmentDownloadSlot: a.customType({
592
+ ok: a.boolean().required(),
593
+ attachmentId: a.id().required(),
594
+ method: a.string().required(),
595
+ downloadUrl: a.string().required(),
596
+ storagePath: a.string().required(),
597
+ mediaType: a.string().required(),
598
+ byteSize: a.integer().required(),
599
+ sha256: a.string(),
600
+ expiresAt: a.datetime().required(),
601
+ requiredHeaders: a.json(),
602
+ }),
603
+ ModelAttachmentUploadAbortResult: a.customType({
604
+ ok: a.boolean().required(),
605
+ uploadId: a.string().required(),
606
+ attachmentId: a.id().required(),
607
+ storagePath: a.string().required(),
608
+ status: a.string().required(),
609
+ }),
610
+ createModelAttachmentUpload: a
611
+ .mutation()
612
+ .arguments({
613
+ ownerKind: a.string().required(),
614
+ ownerId: a.id().required(),
615
+ ownerLineageId: a.id(),
616
+ ownerVersionNumber: a.integer(),
617
+ ownerVersionKey: a.string(),
618
+ role: a.string().required(),
619
+ sortKey: a.string(),
620
+ filename: a.string().required(),
621
+ mediaType: a.string().required(),
622
+ byteSize: a.integer().required(),
623
+ sha256: a.string(),
624
+ importRunId: a.id(),
625
+ status: a.string(),
626
+ })
627
+ .returns(a.ref("ModelAttachmentUploadSlot"))
628
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
629
+ .handler(functionHandler("modelAttachmentUpload", modelAttachmentUpload)),
630
+ completeModelAttachmentUpload: a
631
+ .mutation()
632
+ .arguments({
633
+ uploadId: a.string().required(),
634
+ ownerKind: a.string().required(),
635
+ ownerId: a.id().required(),
636
+ ownerLineageId: a.id(),
637
+ ownerVersionNumber: a.integer(),
638
+ ownerVersionKey: a.string(),
639
+ role: a.string().required(),
640
+ sortKey: a.string(),
641
+ filename: a.string().required(),
642
+ mediaType: a.string().required(),
643
+ byteSize: a.integer().required(),
644
+ sha256: a.string(),
645
+ importRunId: a.id(),
646
+ status: a.string(),
647
+ })
648
+ .returns(a.ref("ModelAttachment"))
649
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
650
+ .handler(functionHandler("modelAttachmentUpload", modelAttachmentUpload)),
651
+ abortModelAttachmentUpload: a
652
+ .mutation()
653
+ .arguments({
654
+ uploadId: a.string().required(),
655
+ ownerKind: a.string().required(),
656
+ ownerId: a.id().required(),
657
+ ownerLineageId: a.id(),
658
+ ownerVersionNumber: a.integer(),
659
+ ownerVersionKey: a.string(),
660
+ role: a.string().required(),
661
+ sortKey: a.string(),
662
+ filename: a.string().required(),
663
+ mediaType: a.string().required(),
664
+ byteSize: a.integer().required(),
665
+ sha256: a.string(),
666
+ importRunId: a.id(),
667
+ status: a.string(),
668
+ })
669
+ .returns(a.ref("ModelAttachmentUploadAbortResult"))
670
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
671
+ .handler(functionHandler("modelAttachmentUpload", modelAttachmentUpload)),
672
+ createModelAttachmentDownload: a
673
+ .mutation()
674
+ .arguments({
675
+ attachmentId: a.id().required(),
676
+ })
677
+ .returns(a.ref("ModelAttachmentDownloadSlot"))
678
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
679
+ .handler(functionHandler("modelAttachmentUpload", modelAttachmentUpload)),
680
+ AssignmentActionResult: a.customType({
681
+ ok: a.boolean().required(),
682
+ assignmentId: a.id(),
683
+ eventId: a.id(),
684
+ status: a.string(),
685
+ action: a.string().required(),
686
+ assigneeKey: a.string(),
687
+ claimExpiresAt: a.datetime(),
688
+ }),
689
+ AssignmentTargetSummary: a.customType({
690
+ kind: a.string().required(),
691
+ id: a.id().required(),
692
+ lineageId: a.id().required(),
693
+ label: a.string(),
694
+ detail: a.string(),
695
+ }),
696
+ AssignmentSummary: a.customType({
697
+ id: a.id().required(),
698
+ assignmentTypeKey: a.string().required(),
699
+ queueKey: a.string().required(),
700
+ queueStatusKey: a.string().required(),
701
+ status: a.string().required(),
702
+ priority: a.integer(),
703
+ title: a.string().required(),
704
+ summary: a.string(),
705
+ assigneeType: a.string(),
706
+ assigneeId: a.string(),
707
+ assigneeKey: a.string(),
708
+ claimedAt: a.datetime(),
709
+ claimExpiresAt: a.datetime(),
710
+ completedAt: a.datetime(),
711
+ canceledAt: a.datetime(),
712
+ corpusId: a.id(),
713
+ categorySetId: a.id(),
714
+ classifierId: a.string(),
715
+ sectionId: a.id(),
716
+ sectionKey: a.string(),
717
+ sectionType: a.string(),
718
+ sectionStatusKey: a.string(),
719
+ sectionQueueStatusKey: a.string(),
720
+ primaryFocusCategoryKey: a.string(),
721
+ topicScopeCategoryKeys: a.string().array(),
722
+ sourceSnapshotId: a.string(),
723
+ importRunId: a.id(),
724
+ createdBy: a.string(),
725
+ createdAt: a.datetime().required(),
726
+ updatedAt: a.datetime().required(),
727
+ }),
728
+ AssignmentEventSummary: a.customType({
729
+ id: a.id().required(),
730
+ assignmentId: a.id().required(),
731
+ assignmentTypeKey: a.string().required(),
732
+ queueKey: a.string().required(),
733
+ eventType: a.string().required(),
734
+ fromStatus: a.string(),
735
+ toStatus: a.string(),
736
+ actorSub: a.string(),
737
+ actorLabel: a.string(),
738
+ note: a.string(),
739
+ createdAt: a.datetime().required(),
740
+ }),
741
+ AssignmentDoctrineSummary: a.customType({
742
+ scope: a.string().required(),
743
+ kind: a.string().required(),
744
+ label: a.string().required(),
745
+ slug: a.string().required(),
746
+ body: a.string().array().required(),
747
+ categoryKey: a.string(),
748
+ categoryLineageId: a.id(),
749
+ }),
750
+ AssignmentContext: a.customType({
751
+ editorialContext: a.json().required(),
752
+ assignment: a.ref("AssignmentSummary"),
753
+ doctrine: a.ref("AssignmentDoctrineSummary").array().required(),
754
+ targets: a.ref("AssignmentTargetSummary").array().required(),
755
+ events: a.ref("AssignmentEventSummary").array().required(),
756
+ }),
757
+ listAssignmentsForObject: a
758
+ .query()
759
+ .arguments({
760
+ objectKind: a.string().required(),
761
+ objectLineageId: a.id().required(),
762
+ status: a.string(),
763
+ limit: a.integer(),
764
+ })
765
+ .returns(a.ref("AssignmentContext").array().required())
766
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
767
+ .handler(functionHandler("assignmentAction", assignmentAction)),
768
+ listAssignmentQueue: a
769
+ .query()
770
+ .arguments({
771
+ queueKey: a.string().required(),
772
+ status: a.string(),
773
+ limit: a.integer(),
774
+ })
775
+ .returns(a.ref("AssignmentContext").array().required())
776
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
777
+ .handler(functionHandler("assignmentAction", assignmentAction)),
778
+ getEditorialContext: a
779
+ .query()
780
+ .arguments({
781
+ publicationKey: a.string().required(),
782
+ sectionId: a.id(),
783
+ storyLineageId: a.id(),
784
+ assignmentId: a.id(),
785
+ maxCharacters: a.integer(),
786
+ optionalPublicationDoctrine: a.boolean(),
787
+ })
788
+ .returns(a.json().required())
789
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
790
+ .handler(functionHandler("assignmentAction", assignmentAction)),
791
+ getAssignmentContext: a
792
+ .query()
793
+ .arguments({
794
+ assignmentId: a.id().required(),
795
+ })
796
+ .returns(a.ref("AssignmentContext"))
797
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
798
+ .handler(functionHandler("assignmentAction", assignmentAction)),
799
+ claimAssignment: a
800
+ .mutation()
801
+ .arguments({
802
+ assignmentId: a.id().required(),
803
+ assigneeKey: a.string(),
804
+ assigneeType: a.string(),
805
+ assigneeId: a.string(),
806
+ claimExpiresAt: a.datetime(),
807
+ claimTtlSeconds: a.integer(),
808
+ actorSub: a.string(),
809
+ actorLabel: a.string(),
810
+ note: a.string(),
811
+ })
812
+ .returns(a.ref("AssignmentActionResult"))
813
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
814
+ .handler(functionHandler("assignmentAction", assignmentAction)),
815
+ releaseAssignment: a
816
+ .mutation()
817
+ .arguments({
818
+ assignmentId: a.id().required(),
819
+ actorSub: a.string(),
820
+ actorLabel: a.string(),
821
+ note: a.string(),
822
+ })
823
+ .returns(a.ref("AssignmentActionResult"))
824
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
825
+ .handler(functionHandler("assignmentAction", assignmentAction)),
826
+ completeAssignment: a
827
+ .mutation()
828
+ .arguments({
829
+ assignmentId: a.id().required(),
830
+ actorSub: a.string(),
831
+ actorLabel: a.string(),
832
+ note: a.string(),
833
+ })
834
+ .returns(a.ref("AssignmentActionResult"))
835
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
836
+ .handler(functionHandler("assignmentAction", assignmentAction)),
837
+ cancelAssignment: a
838
+ .mutation()
839
+ .arguments({
840
+ assignmentId: a.id().required(),
841
+ actorSub: a.string(),
842
+ actorLabel: a.string(),
843
+ note: a.string(),
844
+ })
845
+ .returns(a.ref("AssignmentActionResult"))
846
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
847
+ .handler(functionHandler("assignmentAction", assignmentAction)),
848
+ reopenAssignment: a
849
+ .mutation()
850
+ .arguments({
851
+ assignmentId: a.id().required(),
852
+ actorSub: a.string(),
853
+ actorLabel: a.string(),
854
+ note: a.string(),
855
+ })
856
+ .returns(a.ref("AssignmentActionResult"))
857
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
858
+ .handler(functionHandler("assignmentAction", assignmentAction)),
859
+ retryImmediateAssignment: a
860
+ .mutation()
861
+ .arguments({
862
+ assignmentId: a.id().required(),
863
+ actorSub: a.string(),
864
+ actorLabel: a.string(),
865
+ note: a.string(),
866
+ })
867
+ .returns(a.ref("AssignmentActionResult"))
868
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
869
+ .handler(functionHandler("assignmentAction", assignmentAction)),
870
+ listNewsroomProcedureDefinitions: a
871
+ .query()
872
+ .returns(a.json())
873
+ .authorization((allow) => [allow.group(adminGroup)])
874
+ .handler(functionHandler("procedureAction", procedureAction)),
875
+ getNewsroomProcedureDefinition: a
876
+ .query()
877
+ .arguments({
878
+ id: a.id(),
879
+ procedureKey: a.string(),
880
+ })
881
+ .returns(a.json())
882
+ .authorization((allow) => [allow.group(adminGroup)])
883
+ .handler(functionHandler("procedureAction", procedureAction)),
884
+ saveNewsroomProcedureDefinition: a
885
+ .mutation()
886
+ .arguments({
887
+ input: a.json().required(),
888
+ })
889
+ .returns(a.json())
890
+ .authorization((allow) => [allow.group(adminGroup)])
891
+ .handler(functionHandler("procedureAction", procedureAction)),
892
+ saveNewsroomProcedureVersionDraft: a
893
+ .mutation()
894
+ .arguments({
895
+ input: a.json().required(),
896
+ })
897
+ .returns(a.json())
898
+ .authorization((allow) => [allow.group(adminGroup)])
899
+ .handler(functionHandler("procedureAction", procedureAction)),
900
+ publishNewsroomProcedureVersion: a
901
+ .mutation()
902
+ .arguments({
903
+ versionId: a.id().required(),
904
+ })
905
+ .returns(a.json())
906
+ .authorization((allow) => [allow.group(adminGroup)])
907
+ .handler(functionHandler("procedureAction", procedureAction)),
908
+ startNewsroomProcedureRun: a
909
+ .mutation()
910
+ .arguments({
911
+ procedureId: a.id(),
912
+ procedureKey: a.string(),
913
+ procedureVersionId: a.id(),
914
+ title: a.string(),
915
+ summary: a.string(),
916
+ input: a.json(),
917
+ actorLabel: a.string(),
918
+ })
919
+ .returns(a.json())
920
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
921
+ .handler(functionHandler("procedureAction", procedureAction)),
922
+ getNewsroomProcedureRun: a
923
+ .query()
924
+ .arguments({
925
+ id: a.id().required(),
926
+ })
927
+ .returns(a.json())
928
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
929
+ .handler(functionHandler("procedureAction", procedureAction)),
930
+ listNewsroomProcedureRunsByProcedure: a
931
+ .query()
932
+ .arguments({
933
+ procedureId: a.id().required(),
934
+ })
935
+ .returns(a.json())
936
+ .authorization((allow) => [allow.groups(categoryWriteGroups)])
937
+ .handler(functionHandler("procedureAction", procedureAction)),
938
+ Assignment: modelWithoutSubscriptions({
939
+ id: a.id().required(),
940
+ assignmentTypeKey: a.string().required(),
941
+ queueKey: a.string().required(),
942
+ queueStatusKey: a.string().required(),
943
+ status: a.string().required(),
944
+ priority: a.integer(),
945
+ title: a.string().required(),
946
+ summary: a.string(),
947
+ assigneeType: a.string(),
948
+ assigneeId: a.string(),
949
+ assigneeKey: a.string(),
950
+ claimedAt: a.datetime(),
951
+ claimExpiresAt: a.datetime(),
952
+ completedAt: a.datetime(),
953
+ canceledAt: a.datetime(),
954
+ corpusId: a.id(),
955
+ categorySetId: a.id(),
956
+ classifierId: a.string(),
957
+ sectionId: a.id(),
958
+ sectionKey: a.string(),
959
+ sectionType: a.string(),
960
+ sectionStatusKey: a.string(),
961
+ sectionQueueStatusKey: a.string(),
962
+ primaryFocusCategoryKey: a.string(),
963
+ topicScopeCategoryKeys: a.string().array(),
964
+ sourceSnapshotId: a.string(),
965
+ importRunId: a.id(),
966
+ createdBy: a.string(),
967
+ createdAt: a.datetime().required(),
968
+ updatedAt: a.datetime().required(),
969
+ newsroomFeedKey: a.string(),
970
+ itemLineageId: a.id(),
971
+ })
972
+ .secondaryIndexes((index) => [
973
+ index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listAssignmentsByNewsroomFeedAndCreatedAt"),
974
+ index("itemLineageId").sortKeys(["createdAt"]).queryField("listAssignmentsByItemLineageAndCreatedAt"),
975
+ index("queueStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsByQueueStatusAndPriority"),
976
+ index("assignmentTypeKey").sortKeys(["status", "createdAt"]).queryField("listAssignmentsByTypeStatusAndCreatedAt"),
977
+ index("status").sortKeys(["updatedAt"]).queryField("listAssignmentsByStatusAndUpdatedAt"),
978
+ index("assigneeKey").sortKeys(["status", "updatedAt"]).queryField("listAssignmentsByAssigneeStatusAndUpdatedAt"),
979
+ index("importRunId").sortKeys(["createdAt"]).queryField("listAssignmentsByImportRunAndCreatedAt"),
980
+ index("sectionStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsBySectionStatusAndPriority"),
981
+ index("sectionKey").sortKeys(["createdAt"]).queryField("listAssignmentsBySectionAndCreatedAt"),
982
+ index("sectionQueueStatusKey").sortKeys(["priority", "createdAt"]).queryField("listAssignmentsBySectionQueueStatusAndPriority"),
983
+ ])
984
+ .authorization((allow) => [
985
+ allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
986
+ ]),
987
+ AssignmentEvent: modelWithoutSubscriptions({
988
+ id: a.id().required(),
989
+ assignmentId: a.id().required(),
990
+ assignmentTypeKey: a.string().required(),
991
+ queueKey: a.string().required(),
992
+ eventType: a.string().required(),
993
+ fromStatus: a.string(),
994
+ toStatus: a.string(),
995
+ actorSub: a.string(),
996
+ actorLabel: a.string(),
997
+ note: a.string(),
998
+ createdAt: a.datetime().required(),
999
+ })
1000
+ .secondaryIndexes((index) => [
1001
+ index("assignmentId").sortKeys(["createdAt"]).queryField("listAssignmentEventsByAssignmentAndCreatedAt"),
1002
+ index("eventType").sortKeys(["createdAt"]).queryField("listAssignmentEventsByTypeAndCreatedAt"),
1003
+ index("queueKey").sortKeys(["createdAt"]).queryField("listAssignmentEventsByQueueAndCreatedAt"),
1004
+ ])
1005
+ .authorization((allow) => [
1006
+ allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1007
+ ]),
1008
+ ProcedureDefinition: modelWithoutSubscriptions({
1009
+ id: a.id().required(),
1010
+ procedureKey: a.string().required(),
1011
+ title: a.string().required(),
1012
+ category: a.string().required(),
1013
+ description: a.string(),
1014
+ enabled: a.boolean().required(),
1015
+ enabledStatus: a.string().required(),
1016
+ currentVersionId: a.id(),
1017
+ createdBy: a.string(),
1018
+ createdAt: a.datetime().required(),
1019
+ updatedBy: a.string(),
1020
+ updatedAt: a.datetime().required(),
1021
+ newsroomFeedKey: a.string(),
1022
+ })
1023
+ .secondaryIndexes((index) => [
1024
+ index("procedureKey").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByKeyAndUpdatedAt"),
1025
+ index("enabledStatus").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByEnabledAndUpdatedAt"),
1026
+ index("newsroomFeedKey").sortKeys(["updatedAt"]).queryField("listProcedureDefinitionsByFeedAndUpdatedAt"),
1027
+ ])
1028
+ .authorization((allow) => [
1029
+ allow.group(adminGroup),
1030
+ ]),
1031
+ ProcedureVersion: modelWithoutSubscriptions({
1032
+ id: a.id().required(),
1033
+ procedureId: a.id().required(),
1034
+ procedureKey: a.string().required(),
1035
+ versionNumber: a.integer().required(),
1036
+ status: a.string().required(),
1037
+ isCurrent: a.boolean().required(),
1038
+ label: a.string(),
1039
+ tactusSource: a.string().required(),
1040
+ parameterSchema: a.json().required(),
1041
+ defaults: a.json(),
1042
+ changelog: a.string(),
1043
+ createdBy: a.string(),
1044
+ createdAt: a.datetime().required(),
1045
+ updatedBy: a.string(),
1046
+ updatedAt: a.datetime().required(),
1047
+ })
1048
+ .secondaryIndexes((index) => [
1049
+ index("procedureId").sortKeys(["versionNumber"]).queryField("listProcedureVersionsByProcedureAndVersion"),
1050
+ index("procedureId").sortKeys(["createdAt"]).queryField("listProcedureVersionsByProcedureAndCreatedAt"),
1051
+ index("status").sortKeys(["updatedAt"]).queryField("listProcedureVersionsByStatusAndUpdatedAt"),
1052
+ ])
1053
+ .authorization((allow) => [
1054
+ allow.group(adminGroup),
1055
+ ]),
1056
+ ProcedureRun: modelWithoutSubscriptions({
1057
+ id: a.id().required(),
1058
+ procedureId: a.id().required(),
1059
+ procedureKey: a.string().required(),
1060
+ procedureVersionId: a.id().required(),
1061
+ procedureVersionNumber: a.integer(),
1062
+ assignmentId: a.id(),
1063
+ runStatus: a.string().required(),
1064
+ requestedBy: a.string(),
1065
+ requestedAt: a.datetime().required(),
1066
+ startedAt: a.datetime(),
1067
+ finishedAt: a.datetime(),
1068
+ input: a.json(),
1069
+ normalizedInput: a.json(),
1070
+ resultSummary: a.string(),
1071
+ errorSummary: a.string(),
1072
+ output: a.json(),
1073
+ error: a.json(),
1074
+ attempt: a.integer(),
1075
+ newsroomFeedKey: a.string(),
1076
+ usage: a.json(),
1077
+ costUsd: a.float(),
1078
+ })
1079
+ .secondaryIndexes((index) => [
1080
+ index("procedureId").sortKeys(["requestedAt"]).queryField("listProcedureRunsByProcedureAndRequestedAt"),
1081
+ index("assignmentId").sortKeys(["requestedAt"]).queryField("listProcedureRunsByAssignmentAndRequestedAt"),
1082
+ index("runStatus").sortKeys(["requestedAt"]).queryField("listProcedureRunsByStatusAndRequestedAt"),
1083
+ index("newsroomFeedKey").sortKeys(["requestedAt"]).queryField("listProcedureRunsByFeedAndRequestedAt"),
1084
+ ])
1085
+ .authorization((allow) => [
1086
+ allow.group("editor").to(["read"]),
1087
+ allow.group(adminGroup).to(authoringOperations),
1088
+ ]),
1089
+ /** A named "when X happens, run procedure Y" (PPY-9ff95b). Step 1 mirrors the monitoring router's procedureTriggers and starts nothing itself. */
1090
+ Automation: modelWithoutSubscriptions({
1091
+ id: a.id().required(),
1092
+ title: a.string().required(),
1093
+ description: a.string(),
1094
+ enabled: a.boolean().required(),
1095
+ trigger: a.json().required(),
1096
+ procedureKey: a.string().required(),
1097
+ inputTemplate: a.json(),
1098
+ limits: a.json(),
1099
+ createdBy: a.string(),
1100
+ createdAt: a.datetime().required(),
1101
+ updatedBy: a.string(),
1102
+ updatedAt: a.datetime().required(),
1103
+ })
1104
+ .authorization((allow) => [
1105
+ allow.group("editor").to(["read", "create", "update"]),
1106
+ allow.group(adminGroup).to(authoringOperations),
1107
+ ]),
1108
+ /** A human review point raised by a step on any item (PPY-ab6a50). Review is not a story state. */
1109
+ ReviewRequest: modelWithoutSubscriptions({
1110
+ id: a.id().required(),
1111
+ subject: a.json().required(),
1112
+ mode: a.string().required(),
1113
+ reason: a.string().required(),
1114
+ ask: a.string(),
1115
+ raisedBy: a.string().required(),
1116
+ raisedAt: a.datetime().required(),
1117
+ deadline: a.datetime(),
1118
+ state: a.string().required(),
1119
+ answer: a.json(),
1120
+ links: a.json(),
1121
+ history: a.json(),
1122
+ appliedIn: a.json(),
1123
+ updatedAt: a.datetime().required(),
1124
+ })
1125
+ .authorization((allow) => [
1126
+ allow.group("editor").to(["read", "create", "update"]),
1127
+ allow.group(adminGroup).to(authoringOperations),
1128
+ ]),
1129
+ /** One user's read mark on one review request; id is "<userKey>#<requestId>". */
1130
+ ReviewReadMark: modelWithoutSubscriptions({
1131
+ id: a.id().required(),
1132
+ requestId: a.string().required(),
1133
+ userKey: a.string().required(),
1134
+ readAt: a.datetime().required(),
1135
+ })
1136
+ .authorization((allow) => [
1137
+ allow.groups(["editor", adminGroup]).to(["read", "create", "update"]),
1138
+ ]),
1139
+ /** Who is told about review requests: scope default, mode or automation. Changed by data, not code. */
1140
+ ReviewRecipientRule: modelWithoutSubscriptions({
1141
+ id: a.id().required(),
1142
+ scope: a.string().required(),
1143
+ key: a.string(),
1144
+ roles: a.string().array(),
1145
+ emails: a.string().array(),
1146
+ updatedBy: a.string(),
1147
+ updatedAt: a.datetime().required(),
1148
+ })
1149
+ .authorization((allow) => [
1150
+ allow.group("editor").to(["read"]),
1151
+ allow.group(adminGroup).to(authoringOperations),
1152
+ ]),
1153
+ NewsroomSection: modelWithoutSubscriptions({
1154
+ id: a.id().required(),
1155
+ tenantId: a.string(),
1156
+ title: a.string().required(),
1157
+ type: a.string().required(),
1158
+ editorialMission: a.string().required(),
1159
+ editorialPolicy: a.string().required(),
1160
+ enabled: a.boolean().required(),
1161
+ enabledStatus: a.string().required(),
1162
+ sortOrder: a.integer().required(),
1163
+ shortTitle: a.string().required(),
1164
+ defaultArticleTypes: a.string().array(),
1165
+ defaultPageBudget: a.integer(),
1166
+ assignmentGuidance: a.string(),
1167
+ killCriteria: a.string(),
1168
+ visualGuidance: a.string(),
1169
+ createdAt: a.datetime(),
1170
+ updatedAt: a.datetime(),
1171
+ })
1172
+ .secondaryIndexes((index) => [
1173
+ index("sortOrder").sortKeys(["id"]).queryField("listNewsroomSectionsBySortOrder"),
1174
+ index("tenantId").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByTenantAndSortOrder"),
1175
+ index("type").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByTypeAndSortOrder"),
1176
+ index("enabledStatus").sortKeys(["sortOrder"]).queryField("listNewsroomSectionsByEnabledStatusAndSortOrder"),
1177
+ ])
1178
+ .authorization((allow) => [
1179
+ allow.groups(categoryWriteGroups),
1180
+ ]),
1181
+ KnowledgeCorpus: modelWithoutSubscriptions({
1182
+ id: a.id().required(),
1183
+ name: a.string().required(),
1184
+ role: a.string().required(),
1185
+ itemCount: a.integer(),
1186
+ generatedAt: a.datetime(),
1187
+ latestImportRunId: a.id(),
1188
+ createdAt: a.datetime(),
1189
+ updatedAt: a.datetime(),
1190
+ })
1191
+ .secondaryIndexes((index) => [
1192
+ index("role").sortKeys(["name"]).queryField("listKnowledgeCorporaByRoleAndName"),
1193
+ ])
1194
+ .authorization((allow) => [
1195
+ allow.groups(categoryWriteGroups).to(["read"]),
1196
+ ]),
1197
+ KnowledgeImportRun: modelWithoutSubscriptions({
1198
+ id: a.id().required(),
1199
+ corpusId: a.id().required(),
1200
+ importKind: a.string().required(),
1201
+ corpusImportKindKey: a.string(),
1202
+ classifierId: a.string(),
1203
+ sourceSnapshotId: a.string(),
1204
+ status: a.string().required(),
1205
+ generatedAt: a.datetime(),
1206
+ importedAt: a.datetime().required(),
1207
+ itemCount: a.integer(),
1208
+ categoryCount: a.integer(),
1209
+ proposalCount: a.integer(),
1210
+ artifactCount: a.integer(),
1211
+ referenceCount: a.integer(),
1212
+ relationCount: a.integer(),
1213
+ warningCount: a.integer(),
1214
+ })
1215
+ .secondaryIndexes((index) => [
1216
+ index("corpusId").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByCorpusAndImportedAt"),
1217
+ index("importKind").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByKindAndImportedAt"),
1218
+ index("corpusImportKindKey").sortKeys(["importedAt"]).queryField("listKnowledgeImportRunsByCorpusKindAndImportedAt"),
1219
+ ])
1220
+ .authorization((allow) => [
1221
+ allow.groups(categoryWriteGroups).to(["read"]),
1222
+ ]),
1223
+ KnowledgeRawPayload: modelWithoutSubscriptions({
1224
+ id: a.id().required(),
1225
+ ownerType: a.string().required(),
1226
+ ownerId: a.id().required(),
1227
+ payloadKind: a.string().required(),
1228
+ importRunId: a.id(),
1229
+ createdAt: a.datetime().required(),
1230
+ updatedAt: a.datetime(),
1231
+ })
1232
+ .secondaryIndexes((index) => [
1233
+ index("ownerId").sortKeys(["payloadKind"]).queryField("listKnowledgeRawPayloadsByOwnerAndKind"),
1234
+ index("importRunId").sortKeys(["ownerType"]).queryField("listKnowledgeRawPayloadsByImportRunAndOwner"),
1235
+ ])
1236
+ .authorization((allow) => [
1237
+ allow.groups(categoryWriteGroups),
1238
+ ]),
1239
+ KnowledgeArtifact: modelWithoutSubscriptions({
1240
+ id: a.id().required(),
1241
+ corpusId: a.id().required(),
1242
+ artifactKind: a.string().required(),
1243
+ artifactId: a.string().required(),
1244
+ snapshotId: a.string(),
1245
+ displayName: a.string(),
1246
+ createdAt: a.datetime(),
1247
+ importRunId: a.id(),
1248
+ })
1249
+ .secondaryIndexes((index) => [
1250
+ index("corpusId").sortKeys(["artifactKind"]).queryField("listKnowledgeArtifactsByCorpusAndKind"),
1251
+ index("artifactKind").sortKeys(["createdAt"]).queryField("listKnowledgeArtifactsByKindAndCreatedAt"),
1252
+ index("importRunId").sortKeys(["artifactKind"]).queryField("listKnowledgeArtifactsByImportRunAndKind"),
1253
+ ])
1254
+ .authorization((allow) => [
1255
+ allow.groups(categoryWriteGroups).to(["read"]),
1256
+ ]),
1257
+ CategorySet: modelWithoutSubscriptions({
1258
+ id: a.id().required(),
1259
+ lineageId: a.id().required(),
1260
+ versionNumber: a.integer().required(),
1261
+ previousVersionId: a.id(),
1262
+ versionState: a.string().required(),
1263
+ versionCreatedAt: a.datetime().required(),
1264
+ versionCreatedBy: a.string(),
1265
+ changeReason: a.string(),
1266
+ contentHash: a.string(),
1267
+ corpusId: a.id().required(),
1268
+ classifierId: a.string().required(),
1269
+ displayName: a.string().required(),
1270
+ description: a.string(),
1271
+ status: a.string().required(),
1272
+ generatedAt: a.datetime(),
1273
+ categoryCount: a.integer(),
1274
+ importRunId: a.id(),
1275
+ })
1276
+ .secondaryIndexes((index) => [
1277
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listCategorySetsByLineageAndVersion"),
1278
+ index("corpusId").sortKeys(["classifierId"]).queryField("listCategorySetsByCorpusAndClassifier"),
1279
+ index("status").sortKeys(["displayName"]).queryField("listCategorySetsByStatusAndName"),
1280
+ index("versionState").sortKeys(["generatedAt"]).queryField("listCategorySetsByVersionStateAndGeneratedAt"),
1281
+ ])
1282
+ .authorization((allow) => [
1283
+ allow.groups(categoryWriteGroups),
1284
+ ]),
1285
+ Category: modelWithoutSubscriptions({
1286
+ id: a.id().required(),
1287
+ lineageId: a.id().required(),
1288
+ versionNumber: a.integer().required(),
1289
+ previousVersionId: a.id(),
1290
+ versionState: a.string().required(),
1291
+ versionCreatedAt: a.datetime().required(),
1292
+ versionCreatedBy: a.string(),
1293
+ changeReason: a.string(),
1294
+ contentHash: a.string(),
1295
+ categorySetId: a.id().required(),
1296
+ corpusId: a.id().required(),
1297
+ categoryKey: a.string().required(),
1298
+ parentCategoryId: a.id(),
1299
+ parentCategoryKey: a.string(),
1300
+ displayName: a.string().required(),
1301
+ shortTitle: a.string(),
1302
+ subtitle: a.string(),
1303
+ description: a.string(),
1304
+ aliases: a.string().array(),
1305
+ status: a.string().required(),
1306
+ seedItemIds: a.string().array(),
1307
+ holdoutItemIds: a.string().array(),
1308
+ rank: a.integer(),
1309
+ depth: a.integer(),
1310
+ isPinned: a.boolean(),
1311
+ importRunId: a.id(),
1312
+ updatedAt: a.datetime(),
1313
+ })
1314
+ .secondaryIndexes((index) => [
1315
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listCategoriesByLineageAndVersion"),
1316
+ index("categorySetId").sortKeys(["categoryKey"]).queryField("listCategoriesBySetAndKey"),
1317
+ index("parentCategoryId").sortKeys(["rank"]).queryField("listCategoriesByParentAndRank"),
1318
+ index("parentCategoryKey").sortKeys(["rank"]).queryField("listCategoriesByParentKeyAndRank"),
1319
+ index("corpusId").sortKeys(["displayName"]).queryField("listCategoriesByCorpusAndName"),
1320
+ index("status").sortKeys(["displayName"]).queryField("listCategoriesByStatusAndName"),
1321
+ ])
1322
+ .authorization((allow) => [
1323
+ allow.groups(categoryWriteGroups),
1324
+ ]),
1325
+ CategoryKeyword: modelWithoutSubscriptions({
1326
+ id: a.id().required(),
1327
+ categorySetId: a.id().required(),
1328
+ corpusId: a.id().required(),
1329
+ categoryKey: a.string().required(),
1330
+ categoryLineageId: a.id(),
1331
+ categoryId: a.id(),
1332
+ keyword: a.string().required(),
1333
+ normalizedKeyword: a.string().required(),
1334
+ weight: a.float(),
1335
+ rank: a.integer(),
1336
+ source: a.string().required(),
1337
+ sourceTopicId: a.string(),
1338
+ importRunId: a.id(),
1339
+ metadata: a.json(),
1340
+ createdAt: a.datetime().required(),
1341
+ updatedAt: a.datetime(),
1342
+ })
1343
+ .secondaryIndexes((index) => [
1344
+ index("categorySetId").sortKeys(["categoryKey", "rank"]).queryField("listCategoryKeywordsBySetKeyAndRank"),
1345
+ index("categoryKey").sortKeys(["rank"]).queryField("listCategoryKeywordsByCategoryKeyAndRank"),
1346
+ index("normalizedKeyword").sortKeys(["categorySetId"]).queryField("listCategoryKeywordsByNormalizedKeywordAndSet"),
1347
+ index("importRunId").sortKeys(["rank"]).queryField("listCategoryKeywordsByImportRunAndRank"),
1348
+ ])
1349
+ .authorization((allow) => [
1350
+ allow.groups(categoryWriteGroups),
1351
+ ]),
1352
+ LexicalSteeringRule: modelWithoutSubscriptions({
1353
+ id: a.id().required(),
1354
+ ruleKind: a.string().required(),
1355
+ term: a.string().required(),
1356
+ normalizedTerm: a.string().required(),
1357
+ scope: a.string().required(),
1358
+ status: a.string().required(),
1359
+ corpusId: a.id(),
1360
+ classifierId: a.string(),
1361
+ categorySetId: a.id(),
1362
+ categoryKey: a.string(),
1363
+ note: a.string(),
1364
+ source: a.string(),
1365
+ createdBy: a.string(),
1366
+ createdAt: a.datetime().required(),
1367
+ updatedAt: a.datetime(),
1368
+ metadata: a.json(),
1369
+ })
1370
+ .secondaryIndexes((index) => [
1371
+ index("status").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByStatusAndTerm"),
1372
+ index("scope").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByScopeAndTerm"),
1373
+ index("categorySetId").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesBySetAndTerm"),
1374
+ index("corpusId").sortKeys(["normalizedTerm"]).queryField("listLexicalSteeringRulesByCorpusAndTerm"),
1375
+ ])
1376
+ .authorization((allow) => [
1377
+ allow.groups(categoryWriteGroups),
1378
+ ]),
1379
+ SteeringProposal: modelWithoutSubscriptions({
1380
+ id: a.id().required(),
1381
+ categorySetId: a.id(),
1382
+ corpusId: a.id().required(),
1383
+ importRunId: a.id(),
1384
+ proposalKind: a.string().required(),
1385
+ steeringDomain: a.string().required(),
1386
+ status: a.string().required(),
1387
+ title: a.string().required(),
1388
+ summary: a.string(),
1389
+ categoryKey: a.string(),
1390
+ targetCategoryKey: a.string(),
1391
+ graphEntityId: a.string(),
1392
+ relationshipType: a.string(),
1393
+ displayName: a.string(),
1394
+ shortTitle: a.string(),
1395
+ subtitle: a.string(),
1396
+ description: a.string(),
1397
+ evidenceItemIds: a.string().array(),
1398
+ suggestedSeedItemIds: a.string().array(),
1399
+ suggestedHoldoutItemIds: a.string().array(),
1400
+ sourceSnapshotId: a.string(),
1401
+ proposedAt: a.datetime(),
1402
+ reviewedAt: a.datetime(),
1403
+ reviewedBy: a.string(),
1404
+ updatedAt: a.datetime(),
1405
+ })
1406
+ .secondaryIndexes((index) => [
1407
+ index("status").sortKeys(["proposedAt"]).queryField("listSteeringProposalsByStatusAndProposedAt"),
1408
+ index("categorySetId").sortKeys(["status"]).queryField("listSteeringProposalsBySetAndStatus"),
1409
+ index("corpusId").sortKeys(["proposalKind"]).queryField("listSteeringProposalsByCorpusAndKind"),
1410
+ index("steeringDomain").sortKeys(["status"]).queryField("listSteeringProposalsByDomainAndStatus"),
1411
+ ])
1412
+ .authorization((allow) => [
1413
+ allow.groups(categoryWriteGroups).to(["read"]),
1414
+ ]),
1415
+ SteeringDecision: modelWithoutSubscriptions({
1416
+ id: a.id().required(),
1417
+ proposalId: a.id().required(),
1418
+ categorySetId: a.id(),
1419
+ action: a.string().required(),
1420
+ actorSub: a.string(),
1421
+ actorLabel: a.string(),
1422
+ note: a.string(),
1423
+ selectedCategoryKey: a.string(),
1424
+ createdAt: a.datetime().required(),
1425
+ })
1426
+ .secondaryIndexes((index) => [
1427
+ index("proposalId").sortKeys(["createdAt"]).queryField("listSteeringDecisionsByProposalAndCreatedAt"),
1428
+ index("categorySetId").sortKeys(["createdAt"]).queryField("listSteeringDecisionsBySetAndCreatedAt"),
1429
+ ])
1430
+ .authorization((allow) => [
1431
+ allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1432
+ ]),
1433
+ Reference: realtimeModel({
1434
+ id: a.id().required(),
1435
+ lineageId: a.id().required(),
1436
+ versionNumber: a.integer().required(),
1437
+ previousVersionId: a.id(),
1438
+ versionState: a.string().required(),
1439
+ versionCreatedAt: a.datetime().required(),
1440
+ versionCreatedBy: a.string(),
1441
+ changeReason: a.string(),
1442
+ contentHash: a.string(),
1443
+ corpusId: a.id().required(),
1444
+ externalItemId: a.string().required(),
1445
+ title: a.string(),
1446
+ authors: a.string().array(),
1447
+ sourceUri: a.string(),
1448
+ storagePath: a.string(),
1449
+ mediaType: a.string(),
1450
+ byteSize: a.integer(),
1451
+ sha256: a.string(),
1452
+ sourcePublishedAt: a.string(),
1453
+ sourceUpdatedAt: a.string(),
1454
+ retrievedAt: a.string(),
1455
+ inboundCitationCount: a.integer(),
1456
+ outboundCitationCount: a.integer(),
1457
+ importRunId: a.id(),
1458
+ importedAt: a.datetime(),
1459
+ createdAt: a.datetime(),
1460
+ curationStatus: a.string(),
1461
+ curationStatusKey: a.string(),
1462
+ curationStatusUpdatedAt: a.datetime(),
1463
+ curationStatusUpdatedBy: a.string(),
1464
+ curationStatusReason: a.string(),
1465
+ newsroomFeedKey: a.string(),
1466
+ reviewedFeedKey: a.string(),
1467
+ updatedAt: a.datetime(),
1468
+ })
1469
+ .secondaryIndexes((index) => [
1470
+ index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listReferencesByNewsroomFeedAndCreatedAt"),
1471
+ index("newsroomFeedKey").sortKeys(["importedAt"]).queryField("listReferencesByNewsroomFeedAndImportedAt"),
1472
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listReferencesByLineageAndVersion"),
1473
+ index("corpusId").sortKeys(["externalItemId"]).queryField("listReferencesByCorpusAndExternalItem"),
1474
+ index("versionState").sortKeys(["updatedAt"]).queryField("listReferencesByVersionStateAndUpdatedAt"),
1475
+ index("importRunId").sortKeys(["externalItemId"]).queryField("listReferencesByImportRunAndExternalItem"),
1476
+ index("curationStatus").sortKeys(["curationStatusUpdatedAt"]).queryField("listReferencesByCurationStatusAndUpdatedAt"),
1477
+ index("curationStatusKey").sortKeys(["curationStatusUpdatedAt"]).queryField("listReferencesByCurationStatusKeyAndUpdatedAt"),
1478
+ index("reviewedFeedKey").sortKeys(["updatedAt"]).queryField("listReferencesByReviewedFeedAndUpdatedAt"),
1479
+ ])
1480
+ .authorization((allow) => [
1481
+ allow.groups(categoryWriteGroups).to(["read"]),
1482
+ ]),
1483
+ ReferenceAttachment: modelWithoutSubscriptions({
1484
+ id: a.id().required(),
1485
+ referenceId: a.id().required(),
1486
+ referenceLineageId: a.id().required(),
1487
+ referenceVersionNumber: a.integer(),
1488
+ referenceVersionKey: a.string().required(),
1489
+ role: a.string().required(),
1490
+ sortKey: a.string().required(),
1491
+ storagePath: a.string(),
1492
+ sourceUri: a.string(),
1493
+ filename: a.string(),
1494
+ mediaType: a.string(),
1495
+ byteSize: a.integer(),
1496
+ sha256: a.string(),
1497
+ etag: a.string(),
1498
+ importRunId: a.id(),
1499
+ importedAt: a.datetime(),
1500
+ metadata: a.json(),
1501
+ })
1502
+ .secondaryIndexes((index) => [
1503
+ index("referenceVersionKey").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByReferenceVersionAndSortKey"),
1504
+ index("referenceLineageId").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByReferenceLineageAndSortKey"),
1505
+ index("storagePath").queryField("referenceAttachmentByStoragePath"),
1506
+ index("importRunId").sortKeys(["sortKey"]).queryField("listReferenceAttachmentsByImportRunAndSortKey"),
1507
+ ])
1508
+ .authorization((allow) => [
1509
+ allow.groups(categoryWriteGroups).to(["read"]),
1510
+ ]),
1511
+ SemanticNode: modelWithoutSubscriptions({
1512
+ id: a.id().required(),
1513
+ lineageId: a.id().required(),
1514
+ versionNumber: a.integer().required(),
1515
+ previousVersionId: a.id(),
1516
+ versionState: a.string().required(),
1517
+ versionCreatedAt: a.datetime().required(),
1518
+ versionCreatedBy: a.string(),
1519
+ changeReason: a.string(),
1520
+ contentHash: a.string(),
1521
+ nodeKey: a.string().required(),
1522
+ nodeKind: a.string().required(),
1523
+ corpusId: a.id(),
1524
+ categorySetId: a.id(),
1525
+ categoryLineageId: a.id(),
1526
+ categoryKey: a.string(),
1527
+ displayName: a.string(),
1528
+ description: a.string(),
1529
+ aliases: a.string().array(),
1530
+ authorityScore: a.float(),
1531
+ authorityRank: a.integer(),
1532
+ acceptedReferenceMentionCount: a.integer(),
1533
+ distinctSourceKindCount: a.integer(),
1534
+ relationCount: a.integer(),
1535
+ status: a.string().required(),
1536
+ importRunId: a.id(),
1537
+ createdAt: a.datetime(),
1538
+ newsroomFeedKey: a.string(),
1539
+ updatedAt: a.datetime(),
1540
+ })
1541
+ .secondaryIndexes((index) => [
1542
+ index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listSemanticNodesByNewsroomFeedAndCreatedAt"),
1543
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listSemanticNodesByLineageAndVersion"),
1544
+ index("nodeKey").sortKeys(["versionNumber"]).queryField("listSemanticNodesByNodeKeyAndVersion"),
1545
+ index("corpusId").sortKeys(["nodeKey"]).queryField("listSemanticNodesByCorpusAndNodeKey"),
1546
+ index("importRunId").sortKeys(["nodeKey"]).queryField("listSemanticNodesByImportRunAndNodeKey"),
1547
+ index("versionState").sortKeys(["updatedAt"]).queryField("listSemanticNodesByVersionStateAndUpdatedAt"),
1548
+ ])
1549
+ .authorization((allow) => [
1550
+ allow.groups(categoryWriteGroups).to(["read"]),
1551
+ ]),
1552
+ Message: realtimeModel({
1553
+ id: a.id().required(),
1554
+ messageKind: a.string().required(),
1555
+ messageDomain: a.string().required(),
1556
+ status: a.string().required(),
1557
+ summary: a.string(),
1558
+ source: a.string(),
1559
+ importRunId: a.id(),
1560
+ authorSub: a.string(),
1561
+ authorUserProfileId: a.id(),
1562
+ authorLabel: a.string(),
1563
+ threadId: a.id(),
1564
+ parentMessageId: a.id(),
1565
+ sequenceNumber: a.integer(),
1566
+ role: a.string(),
1567
+ messageType: a.string(),
1568
+ content: a.string(),
1569
+ semanticLayer: a.string(),
1570
+ searchVisibility: a.string(),
1571
+ responseTarget: a.string(),
1572
+ responseStatus: a.string(),
1573
+ responseOwner: a.string(),
1574
+ responseStartedAt: a.datetime(),
1575
+ responseCompletedAt: a.datetime(),
1576
+ responseError: a.string(),
1577
+ metadata: a.json(),
1578
+ createdAt: a.datetime().required(),
1579
+ updatedAt: a.datetime().required(),
1580
+ newsroomFeedKey: a.string(),
1581
+ })
1582
+ .secondaryIndexes((index) => [
1583
+ index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listMessagesByNewsroomFeedAndCreatedAt"),
1584
+ index("status").sortKeys(["createdAt"]).queryField("listMessagesByStatusAndCreatedAt"),
1585
+ index("messageKind").sortKeys(["createdAt"]).queryField("listMessagesByKindAndCreatedAt"),
1586
+ index("messageDomain").sortKeys(["createdAt"]).queryField("listMessagesByDomainAndCreatedAt"),
1587
+ index("authorSub").sortKeys(["createdAt"]).queryField("listMessagesByAuthorSubAndCreatedAt"),
1588
+ index("authorUserProfileId").sortKeys(["createdAt"]).queryField("listMessagesByAuthorProfileAndCreatedAt"),
1589
+ index("importRunId").sortKeys(["createdAt"]).queryField("listMessagesByImportRunAndCreatedAt"),
1590
+ index("threadId").sortKeys(["sequenceNumber"]).name("messagesByThreadSequence").queryField("listMessagesByThreadAndSequence"),
1591
+ index("threadId").sortKeys(["createdAt"]).name("messagesByThreadCreatedAt").queryField("listMessagesByThreadAndCreatedAt"),
1592
+ index("responseTarget").sortKeys(["responseStatus", "createdAt"]).name("messagesByResponseTargetStatusCreatedAt").queryField("listMessagesByResponseTargetStatusAndCreatedAt"),
1593
+ index("semanticLayer").sortKeys(["createdAt"]).name("messagesBySemanticLayerCreatedAt").queryField("listMessagesBySemanticLayerAndCreatedAt"),
1594
+ index("searchVisibility").sortKeys(["createdAt"]).name("messagesBySearchVisibilityCreatedAt").queryField("listMessagesBySearchVisibilityAndCreatedAt"),
1595
+ ])
1596
+ .authorization((allow) => [
1597
+ allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1598
+ ]),
1599
+ MessageThread: realtimeModel({
1600
+ id: a.id().required(),
1601
+ threadKind: a.string().required(),
1602
+ status: a.string().required(),
1603
+ title: a.string().required(),
1604
+ summary: a.string(),
1605
+ primaryAnchorKind: a.string(),
1606
+ primaryAnchorId: a.id(),
1607
+ primaryAnchorLineageId: a.id(),
1608
+ primaryAnchorKey: a.string(),
1609
+ createdBySub: a.string(),
1610
+ createdByUserProfileId: a.id(),
1611
+ createdByLabel: a.string(),
1612
+ messageCount: a.integer(),
1613
+ lastMessageId: a.id(),
1614
+ lastMessageAt: a.datetime(),
1615
+ contextDigest: a.string(),
1616
+ activeResponseMessageId: a.id(),
1617
+ responseLockOwner: a.string(),
1618
+ responseLockExpiresAt: a.datetime(),
1619
+ metadata: a.json(),
1620
+ createdAt: a.datetime().required(),
1621
+ updatedAt: a.datetime().required(),
1622
+ newsroomFeedKey: a.string(),
1623
+ })
1624
+ .secondaryIndexes((index) => [
1625
+ index("newsroomFeedKey").sortKeys(["updatedAt"]).queryField("listMessageThreadsByNewsroomFeedAndUpdatedAt"),
1626
+ index("threadKind").sortKeys(["updatedAt"]).queryField("listMessageThreadsByKindAndUpdatedAt"),
1627
+ index("status").sortKeys(["updatedAt"]).queryField("listMessageThreadsByStatusAndUpdatedAt"),
1628
+ index("primaryAnchorKey").sortKeys(["updatedAt"]).name("messageThreadsByAnchorUpdatedAt").queryField("listMessageThreadsByAnchorAndUpdatedAt"),
1629
+ index("createdBySub").sortKeys(["updatedAt"]).queryField("listMessageThreadsByCreatorAndUpdatedAt"),
1630
+ ])
1631
+ .authorization((allow) => [
1632
+ allow.groups(categoryWriteGroups).to(["read", "create", "update"]),
1633
+ ]),
1634
+ ModelAttachment: modelWithoutSubscriptions({
1635
+ id: a.id().required(),
1636
+ ownerKind: a.string().required(),
1637
+ ownerId: a.id().required(),
1638
+ ownerLineageId: a.id(),
1639
+ ownerVersionNumber: a.integer(),
1640
+ ownerVersionKey: a.string(),
1641
+ role: a.string().required(),
1642
+ sortKey: a.string().required(),
1643
+ storagePath: a.string().required(),
1644
+ filename: a.string(),
1645
+ mediaType: a.string().required(),
1646
+ byteSize: a.integer(),
1647
+ sha256: a.string(),
1648
+ etag: a.string(),
1649
+ importRunId: a.id(),
1650
+ createdAt: a.datetime().required(),
1651
+ updatedAt: a.datetime(),
1652
+ status: a.string().required(),
1653
+ })
1654
+ .secondaryIndexes((index) => [
1655
+ index("ownerId").sortKeys(["role", "sortKey"]).queryField("listModelAttachmentsByOwnerRoleAndSortKey"),
1656
+ index("ownerVersionKey").sortKeys(["role", "sortKey"]).queryField("listModelAttachmentsByOwnerVersionRoleAndSortKey"),
1657
+ index("storagePath").queryField("modelAttachmentByStoragePath"),
1658
+ index("importRunId").sortKeys(["ownerKind", "role"]).queryField("listModelAttachmentsByImportRunKindAndRole"),
1659
+ index("role").sortKeys(["status", "createdAt"]).queryField("listModelAttachmentsByRoleStatusAndCreatedAt"),
1660
+ ])
1661
+ .authorization((allow) => [
1662
+ allow.groups(categoryWriteGroups).to(["read"]),
1663
+ ]),
1664
+ SemanticRelationType: modelWithoutSubscriptions({
1665
+ id: a.id().required(),
1666
+ key: a.string().required(),
1667
+ label: a.string().required(),
1668
+ inverseLabel: a.string(),
1669
+ description: a.string(),
1670
+ domain: a.string().required(),
1671
+ status: a.string().required(),
1672
+ allowedSubjectKinds: a.string().array(),
1673
+ allowedObjectKinds: a.string().array(),
1674
+ isDirectional: a.boolean(),
1675
+ isSymmetric: a.boolean(),
1676
+ isTransitive: a.boolean(),
1677
+ contextPackTags: a.string().array(),
1678
+ createdAt: a.datetime().required(),
1679
+ updatedAt: a.datetime().required(),
1680
+ metadata: a.json(),
1681
+ })
1682
+ .secondaryIndexes((index) => [
1683
+ index("key").queryField("semanticRelationTypeByKey"),
1684
+ index("domain").sortKeys(["label"]).queryField("listSemanticRelationTypesByDomainAndLabel"),
1685
+ index("status").sortKeys(["label"]).queryField("listSemanticRelationTypesByStatusAndLabel"),
1686
+ ])
1687
+ .authorization((allow) => [
1688
+ allow.groups(categoryWriteGroups),
1689
+ ]),
1690
+ SemanticRelation: modelWithoutSubscriptions({
1691
+ id: a.id().required(),
1692
+ relationState: a.string().required(),
1693
+ predicate: a.string().required(),
1694
+ relationTypeId: a.id(),
1695
+ relationTypeKey: a.string(),
1696
+ relationDomain: a.string(),
1697
+ subjectKind: a.string().required(),
1698
+ subjectId: a.id().required(),
1699
+ subjectLineageId: a.id().required(),
1700
+ subjectVersionNumber: a.integer(),
1701
+ objectKind: a.string().required(),
1702
+ objectId: a.id().required(),
1703
+ objectLineageId: a.id().required(),
1704
+ objectVersionNumber: a.integer(),
1705
+ subjectStateKey: a.string().required(),
1706
+ objectStateKey: a.string().required(),
1707
+ objectSubjectStateKey: a.string().required(),
1708
+ predicateObjectStateKey: a.string().required(),
1709
+ subjectVersionKey: a.string().required(),
1710
+ objectVersionKey: a.string().required(),
1711
+ score: a.float(),
1712
+ confidence: a.float(),
1713
+ rank: a.integer(),
1714
+ classifierId: a.string(),
1715
+ modelVersion: a.string(),
1716
+ reviewRecommended: a.boolean(),
1717
+ sourceSnapshotId: a.string(),
1718
+ importRunId: a.id(),
1719
+ importedAt: a.datetime(),
1720
+ createdAt: a.datetime(),
1721
+ updatedAt: a.datetime(),
1722
+ newsroomFeedKey: a.string(),
1723
+ metadata: a.json(),
1724
+ })
1725
+ .secondaryIndexes((index) => [
1726
+ index("newsroomFeedKey").sortKeys(["createdAt"]).queryField("listSemanticRelationsByNewsroomFeedAndCreatedAt"),
1727
+ index("subjectStateKey").sortKeys(["predicateObjectStateKey"]).queryField("listSemanticRelationsBySubjectState"),
1728
+ index("objectStateKey").sortKeys(["predicate"]).queryField("listSemanticRelationsByObjectState"),
1729
+ index("objectSubjectStateKey").sortKeys(["score"]).queryField("listSemanticRelationsByObjectSubjectStateAndScore"),
1730
+ index("predicateObjectStateKey").sortKeys(["score"]).queryField("listSemanticRelationsByPredicateObjectStateAndScore"),
1731
+ index("subjectVersionKey").sortKeys(["predicateObjectStateKey"]).queryField("listSemanticRelationsBySubjectVersion"),
1732
+ index("importRunId").sortKeys(["importedAt"]).queryField("listSemanticRelationsByImportRunAndImportedAt"),
1733
+ index("relationTypeKey").sortKeys(["importedAt"]).queryField("listSemanticRelationsByTypeAndImportedAt"),
1734
+ index("relationDomain").sortKeys(["importedAt"]).queryField("listSemanticRelationsByDomainAndImportedAt"),
1735
+ ])
1736
+ .authorization((allow) => [
1737
+ allow.groups(categoryWriteGroups).to(categoryAppendOnlyOperations),
1738
+ ]),
1739
+ Item: modelWithoutSubscriptions({
1740
+ id: a.id().required(),
1741
+ lineageId: a.id().required(),
1742
+ tenantId: a.string(),
1743
+ versionNumber: a.integer().required(),
1744
+ previousVersionId: a.id(),
1745
+ versionState: a.string().required(),
1746
+ versionCreatedAt: a.datetime().required(),
1747
+ versionCreatedBy: a.string(),
1748
+ changeReason: a.string(),
1749
+ contentHash: a.string(),
1750
+ type: a.string().required(),
1751
+ stage: a.string(),
1752
+ status: a.string().required(),
1753
+ typeStatus: a.string().required(),
1754
+ slug: a.string().required(),
1755
+ tenantSlug: a.string(),
1756
+ shortSlug: a.string(),
1757
+ section: a.string(),
1758
+ sectionStatus: a.string(),
1759
+ title: a.string(),
1760
+ headline: a.string(),
1761
+ deck: a.string(),
1762
+ body: a.string().array(),
1763
+ bodyMarkus: a.string(),
1764
+ bodyIr: a.json(),
1765
+ aliases: a.string().array(),
1766
+ metadata: a.json(),
1767
+ byline: a.string(),
1768
+ dateline: a.string(),
1769
+ publishedAt: a.datetime(),
1770
+ editionDate: a.string(),
1771
+ sortTitle: a.string(),
1772
+ pullQuotes: a.string().array(),
1773
+ layout: a.json(),
1774
+ editorial: a.json(),
1775
+ updatedAt: a.datetime(),
1776
+ tags: a.hasMany("ItemTag", "itemId"),
1777
+ mediaAssets: a.hasMany("MediaAsset", "itemId"),
1778
+ ...(includeEditions ? { editionItems: a.hasMany("EditionItem", "itemId") } : {}),
1779
+ })
1780
+ .secondaryIndexes((index) => [
1781
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listItemsByLineageAndVersion"),
1782
+ index("slug").queryField("itemBySlug"),
1783
+ index("tenantSlug").queryField("itemByTenantSlug"),
1784
+ index("typeStatus").sortKeys(["publishedAt"]).queryField("listItemsByTypeStatusAndPublishedAt"),
1785
+ index("sectionStatus").sortKeys(["publishedAt"]).queryField("listItemsBySectionStatusAndPublishedAt"),
1786
+ index("versionState").sortKeys(["updatedAt"]).queryField("listItemsByVersionStateAndUpdatedAt"),
1787
+ index("stage").sortKeys(["updatedAt"]).queryField("listItemsByStageAndUpdatedAt"),
1788
+ ])
1789
+ .authorization((allow) => [
1790
+ allow.groups(contentWriteGroups),
1791
+ ]),
1792
+ Tag: modelWithoutSubscriptions({
1793
+ id: a.id().required(),
1794
+ slug: a.string().required(),
1795
+ label: a.string().required(),
1796
+ type: a.string(),
1797
+ description: a.string(),
1798
+ items: a.hasMany("ItemTag", "tagId"),
1799
+ })
1800
+ .secondaryIndexes((index) => [
1801
+ index("slug").queryField("tagBySlug"),
1802
+ index("type").sortKeys(["label"]).queryField("listTagsByTypeAndLabel"),
1803
+ ])
1804
+ .authorization((allow) => [
1805
+ allow.groups(contentWriteGroups),
1806
+ ]),
1807
+ ItemTag: modelWithoutSubscriptions({
1808
+ id: a.id().required(),
1809
+ itemId: a.id().required(),
1810
+ tagId: a.id().required(),
1811
+ itemType: a.string().required(),
1812
+ itemStatus: a.string().required(),
1813
+ tagSlug: a.string().required(),
1814
+ publishedAt: a.datetime(),
1815
+ item: a.belongsTo("Item", "itemId"),
1816
+ tag: a.belongsTo("Tag", "tagId"),
1817
+ })
1818
+ .secondaryIndexes((index) => [
1819
+ index("itemId").sortKeys(["tagSlug"]).queryField("listItemTagsByItemAndTag"),
1820
+ index("tagId").sortKeys(["publishedAt"]).queryField("listItemTagsByTagAndPublishedAt"),
1821
+ ])
1822
+ .authorization((allow) => [
1823
+ allow.groups(contentWriteGroups),
1824
+ ]),
1825
+ MediaAsset: modelWithoutSubscriptions({
1826
+ id: a.id().required(),
1827
+ itemId: a.id().required(),
1828
+ tenantId: a.string(),
1829
+ type: a.string().required(),
1830
+ role: a.string().required(),
1831
+ sortKey: a.string().required(),
1832
+ storagePath: a.string(),
1833
+ externalUrl: a.string(),
1834
+ alt: a.string().required(),
1835
+ caption: a.string(),
1836
+ credit: a.string(),
1837
+ width: a.integer(),
1838
+ height: a.integer(),
1839
+ aspectRatio: a.float(),
1840
+ focalX: a.float(),
1841
+ focalY: a.float(),
1842
+ minHeight: a.integer(),
1843
+ preferredHeight: a.integer(),
1844
+ maxHeight: a.integer(),
1845
+ crop: a.string(),
1846
+ wrapsText: a.boolean(),
1847
+ metadata: a.json(),
1848
+ item: a.belongsTo("Item", "itemId"),
1849
+ })
1850
+ .secondaryIndexes((index) => [
1851
+ index("itemId").sortKeys(["sortKey"]).queryField("listMediaAssetsByItemAndSortKey"),
1852
+ index("role").sortKeys(["itemId"]).queryField("listMediaAssetsByRoleAndItem"),
1853
+ ])
1854
+ .authorization((allow) => [
1855
+ allow.groups(contentWriteGroups),
1856
+ ]),
1857
+ Edition: modelWithoutSubscriptions({
1858
+ id: a.id().required(),
1859
+ lineageId: a.id().required(),
1860
+ versionNumber: a.integer().required(),
1861
+ previousVersionId: a.id(),
1862
+ versionState: a.string().required(),
1863
+ versionCreatedAt: a.datetime().required(),
1864
+ versionCreatedBy: a.string(),
1865
+ changeReason: a.string(),
1866
+ contentHash: a.string(),
1867
+ slug: a.string().required(),
1868
+ title: a.string().required(),
1869
+ status: a.string().required(),
1870
+ editionDate: a.string().required(),
1871
+ publishedAt: a.datetime(),
1872
+ description: a.string(),
1873
+ layoutPlan: a.json(),
1874
+ metadata: a.json(),
1875
+ items: a.hasMany("EditionItem", "editionId"),
1876
+ })
1877
+ .secondaryIndexes((index) => [
1878
+ index("lineageId").sortKeys(["versionNumber"]).queryField("listEditionsByLineageAndVersion"),
1879
+ index("slug").queryField("editionBySlug"),
1880
+ index("status").sortKeys(["editionDate"]).queryField("listEditionsByStatusAndEditionDate"),
1881
+ index("status").sortKeys(["publishedAt"]).queryField("listEditionsByStatusAndPublishedAt"),
1882
+ index("versionState").sortKeys(["publishedAt"]).queryField("listEditionsByVersionStateAndPublishedAt"),
1883
+ ])
1884
+ .authorization((allow) => [
1885
+ allow.groups(contentWriteGroups),
1886
+ ]),
1887
+ EditionItem: modelWithoutSubscriptions({
1888
+ id: a.id().required(),
1889
+ editionId: a.id().required(),
1890
+ editionLineageId: a.id(),
1891
+ itemId: a.id().required(),
1892
+ itemLineageId: a.id(),
1893
+ placementKey: a.string().required(),
1894
+ sortKey: a.string().required(),
1895
+ pageNumber: a.integer(),
1896
+ priority: a.integer(),
1897
+ metadata: a.json(),
1898
+ edition: a.belongsTo("Edition", "editionId"),
1899
+ item: a.belongsTo("Item", "itemId"),
1900
+ })
1901
+ .secondaryIndexes((index) => [
1902
+ index("editionId").sortKeys(["sortKey"]).queryField("listEditionItemsByEditionAndSortKey"),
1903
+ index("itemId").sortKeys(["editionId"]).queryField("listEditionItemsByItemAndEdition"),
1904
+ ])
1905
+ .authorization((allow) => [
1906
+ allow.groups(contentWriteGroups),
1907
+ ]),
1908
+ PublishedItem: modelWithoutSubscriptions({
1909
+ id: a.id().required(),
1910
+ sourceItemId: a.id().required(),
1911
+ itemLineageId: a.id().required(),
1912
+ tenantId: a.string(),
1913
+ versionNumber: a.integer().required(),
1914
+ type: a.string().required(),
1915
+ status: a.string().required(),
1916
+ typeStatus: a.string().required(),
1917
+ slug: a.string().required(),
1918
+ tenantSlug: a.string(),
1919
+ shortSlug: a.string(),
1920
+ section: a.string(),
1921
+ sectionStatus: a.string(),
1922
+ title: a.string(),
1923
+ headline: a.string(),
1924
+ deck: a.string(),
1925
+ body: a.string().array(),
1926
+ bodyMarkus: a.string(),
1927
+ bodyIr: a.json(),
1928
+ aliases: a.string().array(),
1929
+ metadata: a.json(),
1930
+ byline: a.string(),
1931
+ dateline: a.string(),
1932
+ publishedAt: a.datetime(),
1933
+ editionDate: a.string(),
1934
+ sortTitle: a.string(),
1935
+ pullQuotes: a.string().array(),
1936
+ layout: a.json(),
1937
+ editorial: a.json(),
1938
+ })
1939
+ .secondaryIndexes((index) => [
1940
+ index("slug").queryField("publishedItemBySlug"),
1941
+ index("tenantSlug").queryField("publishedItemByTenantSlug"),
1942
+ index("typeStatus").sortKeys(["publishedAt"]).queryField("listPublishedItemsByTypeStatusAndPublishedAt"),
1943
+ index("sectionStatus").sortKeys(["publishedAt"]).queryField("listPublishedItemsBySectionStatusAndPublishedAt"),
1944
+ index("itemLineageId").sortKeys(["versionNumber"]).queryField("listPublishedItemsByLineageAndVersion"),
1945
+ ])
1946
+ .authorization((allow) => [
1947
+ allow.guest().to(["read"]),
1948
+ allow.groups(contentWriteGroups),
1949
+ ]),
1950
+ PublishedMediaAsset: modelWithoutSubscriptions({
1951
+ id: a.id().required(),
1952
+ sourceMediaAssetId: a.id().required(),
1953
+ tenantId: a.string(),
1954
+ publishedItemId: a.id().required(),
1955
+ sourceItemId: a.id().required(),
1956
+ itemLineageId: a.id().required(),
1957
+ type: a.string().required(),
1958
+ role: a.string().required(),
1959
+ sortKey: a.string().required(),
1960
+ storagePath: a.string(),
1961
+ externalUrl: a.string(),
1962
+ alt: a.string().required(),
1963
+ caption: a.string(),
1964
+ credit: a.string(),
1965
+ width: a.integer(),
1966
+ height: a.integer(),
1967
+ aspectRatio: a.float(),
1968
+ focalX: a.float(),
1969
+ focalY: a.float(),
1970
+ minHeight: a.integer(),
1971
+ preferredHeight: a.integer(),
1972
+ maxHeight: a.integer(),
1973
+ crop: a.string(),
1974
+ wrapsText: a.boolean(),
1975
+ metadata: a.json(),
1976
+ })
1977
+ .secondaryIndexes((index) => [
1978
+ index("publishedItemId").sortKeys(["sortKey"]).queryField("listPublishedMediaAssetsByItemAndSortKey"),
1979
+ index("role").sortKeys(["publishedItemId"]).queryField("listPublishedMediaAssetsByRoleAndItem"),
1980
+ ])
1981
+ .authorization((allow) => [
1982
+ allow.guest().to(["read"]),
1983
+ allow.groups(contentWriteGroups),
1984
+ ]),
1985
+ PublishedEdition: modelWithoutSubscriptions({
1986
+ id: a.id().required(),
1987
+ sourceEditionId: a.id().required(),
1988
+ editionLineageId: a.id().required(),
1989
+ versionNumber: a.integer().required(),
1990
+ slug: a.string().required(),
1991
+ title: a.string().required(),
1992
+ status: a.string().required(),
1993
+ editionDate: a.string().required(),
1994
+ publishedAt: a.datetime(),
1995
+ description: a.string(),
1996
+ layoutPlan: a.json(),
1997
+ metadata: a.json(),
1998
+ })
1999
+ .secondaryIndexes((index) => [
2000
+ index("slug").queryField("publishedEditionBySlug"),
2001
+ index("status").sortKeys(["editionDate"]).queryField("listPublishedEditionsByStatusAndEditionDate"),
2002
+ index("status").sortKeys(["publishedAt"]).queryField("listPublishedEditionsByStatusAndPublishedAt"),
2003
+ index("editionLineageId").sortKeys(["versionNumber"]).queryField("listPublishedEditionsByLineageAndVersion"),
2004
+ ])
2005
+ .authorization((allow) => [
2006
+ allow.guest().to(["read"]),
2007
+ allow.groups(contentWriteGroups),
2008
+ ]),
2009
+ PublishedEditionItem: modelWithoutSubscriptions({
2010
+ id: a.id().required(),
2011
+ publishedEditionId: a.id().required(),
2012
+ publishedItemId: a.id().required(),
2013
+ sourceEditionItemId: a.id().required(),
2014
+ sourceEditionId: a.id().required(),
2015
+ sourceItemId: a.id().required(),
2016
+ editionLineageId: a.id().required(),
2017
+ itemLineageId: a.id().required(),
2018
+ placementKey: a.string().required(),
2019
+ sortKey: a.string().required(),
2020
+ pageNumber: a.integer(),
2021
+ priority: a.integer(),
2022
+ metadata: a.json(),
2023
+ })
2024
+ .secondaryIndexes((index) => [
2025
+ index("publishedEditionId").sortKeys(["sortKey"]).queryField("listPublishedEditionItemsByEditionAndSortKey"),
2026
+ index("publishedItemId").sortKeys(["publishedEditionId"]).queryField("listPublishedEditionItemsByItemAndEdition"),
2027
+ ])
2028
+ .authorization((allow) => [
2029
+ allow.guest().to(["read"]),
2030
+ allow.groups(contentWriteGroups),
2031
+ ]),
2032
+ PublishedCategorySet: modelWithoutSubscriptions({
2033
+ id: a.id().required(),
2034
+ sourceCategorySetId: a.id().required(),
2035
+ categorySetLineageId: a.id().required(),
2036
+ versionNumber: a.integer().required(),
2037
+ corpusId: a.id().required(),
2038
+ classifierId: a.string().required(),
2039
+ displayName: a.string().required(),
2040
+ description: a.string(),
2041
+ status: a.string().required(),
2042
+ generatedAt: a.datetime(),
2043
+ publishedAt: a.datetime(),
2044
+ categoryCount: a.integer(),
2045
+ metadata: a.json(),
2046
+ })
2047
+ .secondaryIndexes((index) => [
2048
+ index("status").sortKeys(["displayName"]).queryField("listPublishedCategorySetsByStatusAndName"),
2049
+ index("classifierId").sortKeys(["displayName"]).queryField("listPublishedCategorySetsByClassifierAndName"),
2050
+ index("categorySetLineageId").sortKeys(["versionNumber"]).queryField("listPublishedCategorySetsByLineageAndVersion"),
2051
+ ])
2052
+ .authorization((allow) => [
2053
+ allow.guest().to(["read"]),
2054
+ allow.groups(contentWriteGroups),
2055
+ ]),
2056
+ PublishedCategory: modelWithoutSubscriptions({
2057
+ id: a.id().required(),
2058
+ sourceCategoryId: a.id().required(),
2059
+ publishedCategorySetId: a.id().required(),
2060
+ categoryLineageId: a.id().required(),
2061
+ categorySetLineageId: a.id().required(),
2062
+ versionNumber: a.integer().required(),
2063
+ corpusId: a.id().required(),
2064
+ categoryKey: a.string().required(),
2065
+ parentCategoryId: a.id(),
2066
+ parentCategoryKey: a.string(),
2067
+ displayName: a.string().required(),
2068
+ shortTitle: a.string(),
2069
+ subtitle: a.string(),
2070
+ description: a.string(),
2071
+ aliases: a.string().array(),
2072
+ status: a.string().required(),
2073
+ seedItemIds: a.string().array(),
2074
+ holdoutItemIds: a.string().array(),
2075
+ rank: a.integer(),
2076
+ depth: a.integer(),
2077
+ isPinned: a.boolean(),
2078
+ metadata: a.json(),
2079
+ })
2080
+ .secondaryIndexes((index) => [
2081
+ index("publishedCategorySetId").sortKeys(["categoryKey"]).queryField("listPublishedCategoriesBySetAndKey"),
2082
+ index("parentCategoryId").sortKeys(["rank"]).queryField("listPublishedCategoriesByParentAndRank"),
2083
+ index("parentCategoryKey").sortKeys(["rank"]).queryField("listPublishedCategoriesByParentKeyAndRank"),
2084
+ index("categoryKey").sortKeys(["publishedCategorySetId"]).queryField("listPublishedCategoriesByKeyAndSet"),
2085
+ ])
2086
+ .authorization((allow) => [
2087
+ allow.guest().to(["read"]),
2088
+ allow.groups(contentWriteGroups),
2089
+ ]),
2090
+ ...editorialChecksSchemaDefinitions,
2091
+ ...monitoringViewSchemaDefinitions,
2092
+ ...automationViewSchemaDefinitions,
2093
+ };
2094
+ if (!includeEditions) {
2095
+ const mutableDefinitions = definitions;
2096
+ for (const modelName of OPTIONAL_MODEL_GROUPS.editions)
2097
+ delete mutableDefinitions[modelName];
2098
+ }
2099
+ return definitions;
2100
+ }
2101
+ export function baseModelNames(excludedGroups = []) {
2102
+ return Object.keys(buildBaseDefinitions(!excludedGroups.includes("editions")));
2103
+ }
2104
+ const baseDefinitions = buildBaseDefinitions(true);
2105
+ /** Schema-level function grants shared by every deployed schema, with or without plugins, so none can drop one. */
2106
+ function functionGrants(allow) {
2107
+ return [
2003
2108
  allow.resource(assignmentAction).to(["query", "mutate"]),
2004
2109
  allow.resource(categoryAction),
2005
2110
  allow.resource(contentActions),
@@ -2007,5 +2112,16 @@ export function schemaWithPlugins(pluginDefinitions) {
2007
2112
  allow.resource(modelAttachmentUpload),
2008
2113
  allow.resource(newsroomSummary),
2009
2114
  allow.resource(procedureAction),
2010
- ]);
2115
+ allow.resource(publicForms).to(["mutate"]),
2116
+ ];
2117
+ }
2118
+ export const schema = a.schema(baseDefinitions).authorization(functionGrants);
2119
+ /** The deployed schema of a site that enables plugins: the base definitions plus what each plugin contributes (docs/plugins.md). */
2120
+ export function schemaWithPlugins(pluginDefinitions) {
2121
+ return a.schema({ ...baseDefinitions, ...pluginDefinitions }).authorization(functionGrants);
2122
+ }
2123
+ /** The schema of a site that leaves optional model groups out of its first deploy. */
2124
+ export function schemaExcludingGroups(excludedGroups, pluginDefinitions = {}) {
2125
+ const definitions = buildBaseDefinitions(!excludedGroups.includes("editions"));
2126
+ return a.schema({ ...definitions, ...pluginDefinitions }).authorization(functionGrants);
2011
2127
  }