@anthusai/papyrus 2.0.0-next.11 → 2.0.0-next.110

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