@prenta/core 8.9.2 → 8.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/dist/actions.d.ts +25 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +51 -4
  5. package/dist/actions.js.map +1 -1
  6. package/dist/ai/batch-links.d.ts +105 -0
  7. package/dist/ai/batch-links.d.ts.map +1 -0
  8. package/dist/ai/batch-links.js +667 -0
  9. package/dist/ai/batch-links.js.map +1 -0
  10. package/dist/ai/batch-list.d.ts +127 -4
  11. package/dist/ai/batch-list.d.ts.map +1 -1
  12. package/dist/ai/batch-list.js +250 -14
  13. package/dist/ai/batch-list.js.map +1 -1
  14. package/dist/ai/providers/http.d.ts +4 -0
  15. package/dist/ai/providers/http.d.ts.map +1 -1
  16. package/dist/ai/providers/http.js +9 -8
  17. package/dist/ai/providers/http.js.map +1 -1
  18. package/dist/ai/tasks/editor-text.d.ts +39 -0
  19. package/dist/ai/tasks/editor-text.d.ts.map +1 -0
  20. package/dist/ai/tasks/editor-text.js +45 -0
  21. package/dist/ai/tasks/editor-text.js.map +1 -0
  22. package/dist/ai/tasks/link-embeddings.d.ts +22 -0
  23. package/dist/ai/tasks/link-embeddings.d.ts.map +1 -1
  24. package/dist/ai/tasks/link-embeddings.js +24 -10
  25. package/dist/ai/tasks/link-embeddings.js.map +1 -1
  26. package/dist/ai/usage.d.ts +7 -0
  27. package/dist/ai/usage.d.ts.map +1 -1
  28. package/dist/ai/usage.js +11 -0
  29. package/dist/ai/usage.js.map +1 -1
  30. package/dist/api/guarded-db.d.ts +6 -0
  31. package/dist/api/guarded-db.d.ts.map +1 -1
  32. package/dist/api/guarded-db.js +13 -1
  33. package/dist/api/guarded-db.js.map +1 -1
  34. package/dist/api/handlers.d.ts.map +1 -1
  35. package/dist/api/handlers.js +2 -0
  36. package/dist/api/handlers.js.map +1 -1
  37. package/dist/api/openapi.d.ts.map +1 -1
  38. package/dist/api/openapi.js +47 -0
  39. package/dist/api/openapi.js.map +1 -1
  40. package/dist/api/route-helpers/forms.d.ts.map +1 -1
  41. package/dist/api/route-helpers/forms.js +7 -1
  42. package/dist/api/route-helpers/forms.js.map +1 -1
  43. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  44. package/dist/api/routes/ai-authoring.js +1 -0
  45. package/dist/api/routes/ai-authoring.js.map +1 -1
  46. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  47. package/dist/api/routes/ai-seo.js +20 -18
  48. package/dist/api/routes/ai-seo.js.map +1 -1
  49. package/dist/api/routes/media.d.ts.map +1 -1
  50. package/dist/api/routes/media.js +3 -1
  51. package/dist/api/routes/media.js.map +1 -1
  52. package/dist/api/routes/scheduling.d.ts.map +1 -1
  53. package/dist/api/routes/scheduling.js +33 -2
  54. package/dist/api/routes/scheduling.js.map +1 -1
  55. package/dist/appearance/color.d.ts +17 -0
  56. package/dist/appearance/color.d.ts.map +1 -1
  57. package/dist/appearance/color.js +162 -1
  58. package/dist/appearance/color.js.map +1 -1
  59. package/dist/appearance/index.d.ts +3 -3
  60. package/dist/appearance/index.d.ts.map +1 -1
  61. package/dist/appearance/index.js +2 -2
  62. package/dist/appearance/index.js.map +1 -1
  63. package/dist/appearance/resolve.d.ts.map +1 -1
  64. package/dist/appearance/resolve.js +4 -2
  65. package/dist/appearance/resolve.js.map +1 -1
  66. package/dist/appearance/theme-tokens.d.ts +60 -11
  67. package/dist/appearance/theme-tokens.d.ts.map +1 -1
  68. package/dist/appearance/theme-tokens.js +184 -175
  69. package/dist/appearance/theme-tokens.js.map +1 -1
  70. package/dist/appearance/types.d.ts +16 -2
  71. package/dist/appearance/types.d.ts.map +1 -1
  72. package/dist/astro-site.d.ts +1 -11
  73. package/dist/astro-site.d.ts.map +1 -1
  74. package/dist/astro-site.js +4 -0
  75. package/dist/astro-site.js.map +1 -1
  76. package/dist/auth/team.d.ts +1 -0
  77. package/dist/auth/team.d.ts.map +1 -1
  78. package/dist/auth/team.js +1 -1
  79. package/dist/auth/team.js.map +1 -1
  80. package/dist/cache/http.d.ts +20 -0
  81. package/dist/cache/http.d.ts.map +1 -1
  82. package/dist/cache/http.js +42 -0
  83. package/dist/cache/http.js.map +1 -1
  84. package/dist/chrome/announcement.d.ts +30 -0
  85. package/dist/chrome/announcement.d.ts.map +1 -0
  86. package/dist/chrome/announcement.js +190 -0
  87. package/dist/chrome/announcement.js.map +1 -0
  88. package/dist/chrome/codegen.d.ts +17 -0
  89. package/dist/chrome/codegen.d.ts.map +1 -0
  90. package/dist/chrome/codegen.js +96 -0
  91. package/dist/chrome/codegen.js.map +1 -0
  92. package/dist/chrome/contract.d.ts +142 -0
  93. package/dist/chrome/contract.d.ts.map +1 -0
  94. package/dist/chrome/contract.js +2 -0
  95. package/dist/chrome/contract.js.map +1 -0
  96. package/dist/chrome/memory-store.d.ts +15 -0
  97. package/dist/chrome/memory-store.d.ts.map +1 -0
  98. package/dist/chrome/memory-store.js +54 -0
  99. package/dist/chrome/memory-store.js.map +1 -0
  100. package/dist/chrome/parse.d.ts +36 -0
  101. package/dist/chrome/parse.d.ts.map +1 -0
  102. package/dist/chrome/parse.js +277 -0
  103. package/dist/chrome/parse.js.map +1 -0
  104. package/dist/chrome/prisma-store.d.ts +11 -0
  105. package/dist/chrome/prisma-store.d.ts.map +1 -0
  106. package/dist/chrome/prisma-store.js +48 -0
  107. package/dist/chrome/prisma-store.js.map +1 -0
  108. package/dist/chrome/public.d.ts +22 -0
  109. package/dist/chrome/public.d.ts.map +1 -0
  110. package/dist/chrome/public.js +181 -0
  111. package/dist/chrome/public.js.map +1 -0
  112. package/dist/chrome/resolve.d.ts +36 -0
  113. package/dist/chrome/resolve.d.ts.map +1 -0
  114. package/dist/chrome/resolve.js +165 -0
  115. package/dist/chrome/resolve.js.map +1 -0
  116. package/dist/chrome/revalidate.d.ts +9 -0
  117. package/dist/chrome/revalidate.d.ts.map +1 -0
  118. package/dist/chrome/revalidate.js +51 -0
  119. package/dist/chrome/revalidate.js.map +1 -0
  120. package/dist/chrome/routes.d.ts +14 -0
  121. package/dist/chrome/routes.d.ts.map +1 -0
  122. package/dist/chrome/routes.js +306 -0
  123. package/dist/chrome/routes.js.map +1 -0
  124. package/dist/chrome/schema.d.ts +231 -0
  125. package/dist/chrome/schema.d.ts.map +1 -0
  126. package/dist/chrome/schema.js +73 -0
  127. package/dist/chrome/schema.js.map +1 -0
  128. package/dist/chrome/service.d.ts +76 -0
  129. package/dist/chrome/service.d.ts.map +1 -0
  130. package/dist/chrome/service.js +286 -0
  131. package/dist/chrome/service.js.map +1 -0
  132. package/dist/chrome/settings.d.ts +14 -0
  133. package/dist/chrome/settings.d.ts.map +1 -0
  134. package/dist/chrome/settings.js +142 -0
  135. package/dist/chrome/settings.js.map +1 -0
  136. package/dist/chrome/store.d.ts +48 -0
  137. package/dist/chrome/store.d.ts.map +1 -0
  138. package/dist/chrome/store.js +26 -0
  139. package/dist/chrome/store.js.map +1 -0
  140. package/dist/chrome/values.d.ts +98 -0
  141. package/dist/chrome/values.d.ts.map +1 -0
  142. package/dist/chrome/values.js +491 -0
  143. package/dist/chrome/values.js.map +1 -0
  144. package/dist/config/define.d.ts +2 -0
  145. package/dist/config/define.d.ts.map +1 -1
  146. package/dist/config/define.js +2 -0
  147. package/dist/config/define.js.map +1 -1
  148. package/dist/db/model-types.d.ts +62 -0
  149. package/dist/db/model-types.d.ts.map +1 -1
  150. package/dist/forms/attribution-settings.d.ts +23 -0
  151. package/dist/forms/attribution-settings.d.ts.map +1 -0
  152. package/dist/forms/attribution-settings.js +42 -0
  153. package/dist/forms/attribution-settings.js.map +1 -0
  154. package/dist/forms/attribution.d.ts +5 -1
  155. package/dist/forms/attribution.d.ts.map +1 -1
  156. package/dist/forms/attribution.js +6 -4
  157. package/dist/forms/attribution.js.map +1 -1
  158. package/dist/forms/client-validation.d.ts.map +1 -1
  159. package/dist/forms/client-validation.js +3 -0
  160. package/dist/forms/client-validation.js.map +1 -1
  161. package/dist/forms/form-model.d.ts +109 -0
  162. package/dist/forms/form-model.d.ts.map +1 -0
  163. package/dist/forms/form-model.js +192 -0
  164. package/dist/forms/form-model.js.map +1 -0
  165. package/dist/forms/index.d.ts +2 -2
  166. package/dist/forms/index.d.ts.map +1 -1
  167. package/dist/forms/index.js +1 -1
  168. package/dist/forms/index.js.map +1 -1
  169. package/dist/forms/service.d.ts +19 -1
  170. package/dist/forms/service.d.ts.map +1 -1
  171. package/dist/forms/service.js +152 -0
  172. package/dist/forms/service.js.map +1 -1
  173. package/dist/forms/spam.d.ts +0 -12
  174. package/dist/forms/spam.d.ts.map +1 -1
  175. package/dist/forms/spam.js +30 -0
  176. package/dist/forms/spam.js.map +1 -1
  177. package/dist/forms/submission.d.ts +7 -0
  178. package/dist/forms/submission.d.ts.map +1 -1
  179. package/dist/forms/submission.js +33 -0
  180. package/dist/forms/submission.js.map +1 -1
  181. package/dist/forms/types.d.ts +26 -1
  182. package/dist/forms/types.d.ts.map +1 -1
  183. package/dist/forms/types.js +9 -1
  184. package/dist/forms/types.js.map +1 -1
  185. package/dist/generated/browser.d.ts +35 -3
  186. package/dist/generated/client.d.ts +35 -3
  187. package/dist/generated/internal/class.d.ts +44 -0
  188. package/dist/generated/internal/class.js +4 -4
  189. package/dist/generated/internal/prismaNamespace.d.ts +403 -1
  190. package/dist/generated/internal/prismaNamespace.js +95 -1
  191. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +102 -0
  192. package/dist/generated/internal/prismaNamespaceBrowser.js +95 -1
  193. package/dist/generated/models/ChromeRegion.d.ts +1203 -0
  194. package/dist/generated/models/ChromeRegion.js +1 -0
  195. package/dist/generated/models/Job.d.ts +732 -5
  196. package/dist/generated/models/JobEvent.d.ts +1339 -0
  197. package/dist/generated/models/JobEvent.js +1 -0
  198. package/dist/generated/models/JobReviewItem.d.ts +1470 -0
  199. package/dist/generated/models/JobReviewItem.js +1 -0
  200. package/dist/generated/models/SystemSetting.d.ts +952 -0
  201. package/dist/generated/models/SystemSetting.js +1 -0
  202. package/dist/generated/models.d.ts +4 -0
  203. package/dist/index.d.ts +12 -5
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +8 -3
  206. package/dist/index.js.map +1 -1
  207. package/dist/jobs/batch-ai.d.ts +53 -0
  208. package/dist/jobs/batch-ai.d.ts.map +1 -0
  209. package/dist/jobs/batch-ai.js +314 -0
  210. package/dist/jobs/batch-ai.js.map +1 -0
  211. package/dist/jobs/contract.d.ts +186 -0
  212. package/dist/jobs/contract.d.ts.map +1 -0
  213. package/dist/jobs/contract.js +2 -0
  214. package/dist/jobs/contract.js.map +1 -0
  215. package/dist/jobs/error-text.d.ts +23 -0
  216. package/dist/jobs/error-text.d.ts.map +1 -0
  217. package/dist/jobs/error-text.js +110 -0
  218. package/dist/jobs/error-text.js.map +1 -0
  219. package/dist/jobs/handlers.d.ts.map +1 -1
  220. package/dist/jobs/handlers.js +48 -7
  221. package/dist/jobs/handlers.js.map +1 -1
  222. package/dist/jobs/memory-store.d.ts +26 -2
  223. package/dist/jobs/memory-store.d.ts.map +1 -1
  224. package/dist/jobs/memory-store.js +157 -3
  225. package/dist/jobs/memory-store.js.map +1 -1
  226. package/dist/jobs/outcomes.d.ts +46 -0
  227. package/dist/jobs/outcomes.d.ts.map +1 -0
  228. package/dist/jobs/outcomes.js +251 -0
  229. package/dist/jobs/outcomes.js.map +1 -0
  230. package/dist/jobs/prisma-store.d.ts +14 -2
  231. package/dist/jobs/prisma-store.d.ts.map +1 -1
  232. package/dist/jobs/prisma-store.js +257 -15
  233. package/dist/jobs/prisma-store.js.map +1 -1
  234. package/dist/jobs/queue.d.ts +62 -2
  235. package/dist/jobs/queue.d.ts.map +1 -1
  236. package/dist/jobs/queue.js +412 -36
  237. package/dist/jobs/queue.js.map +1 -1
  238. package/dist/jobs/retention.d.ts +11 -0
  239. package/dist/jobs/retention.d.ts.map +1 -0
  240. package/dist/jobs/retention.js +18 -0
  241. package/dist/jobs/retention.js.map +1 -0
  242. package/dist/jobs/review.d.ts +111 -0
  243. package/dist/jobs/review.d.ts.map +1 -0
  244. package/dist/jobs/review.js +461 -0
  245. package/dist/jobs/review.js.map +1 -0
  246. package/dist/jobs/routes.d.ts.map +1 -1
  247. package/dist/jobs/routes.js +491 -16
  248. package/dist/jobs/routes.js.map +1 -1
  249. package/dist/jobs/serialize.d.ts +40 -0
  250. package/dist/jobs/serialize.d.ts.map +1 -0
  251. package/dist/jobs/serialize.js +270 -0
  252. package/dist/jobs/serialize.js.map +1 -0
  253. package/dist/jobs/types.d.ts +141 -2
  254. package/dist/jobs/types.d.ts.map +1 -1
  255. package/dist/jobs/worker-status.d.ts +27 -0
  256. package/dist/jobs/worker-status.d.ts.map +1 -0
  257. package/dist/jobs/worker-status.js +66 -0
  258. package/dist/jobs/worker-status.js.map +1 -0
  259. package/dist/media/optimize.d.ts.map +1 -1
  260. package/dist/media/optimize.js +4 -2
  261. package/dist/media/optimize.js.map +1 -1
  262. package/dist/next-site.d.ts +1 -0
  263. package/dist/next-site.d.ts.map +1 -1
  264. package/dist/next-site.js +3 -0
  265. package/dist/next-site.js.map +1 -1
  266. package/dist/seo/audit-runner.d.ts.map +1 -1
  267. package/dist/seo/audit-runner.js +23 -2
  268. package/dist/seo/audit-runner.js.map +1 -1
  269. package/dist/seo/issue-fix-link-insert.d.ts +11 -0
  270. package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
  271. package/dist/seo/issue-fix-link-insert.js +122 -8
  272. package/dist/seo/issue-fix-link-insert.js.map +1 -1
  273. package/dist/server-site.d.ts.map +1 -1
  274. package/dist/server-site.js +15 -0
  275. package/dist/server-site.js.map +1 -1
  276. package/dist/site.d.ts +8 -0
  277. package/dist/site.d.ts.map +1 -1
  278. package/dist/site.js +6 -0
  279. package/dist/site.js.map +1 -1
  280. package/dist/webhooks/index.d.ts +3 -1
  281. package/dist/webhooks/index.d.ts.map +1 -1
  282. package/dist/webhooks/index.js.map +1 -1
  283. package/package.json +6 -1
  284. package/prisma/migrations/0025_job_cancel_review/down.sql +60 -0
  285. package/prisma/migrations/0025_job_cancel_review/migration.sql +56 -0
  286. package/prisma/migrations/0026_job_creator_system_settings/down.sql +30 -0
  287. package/prisma/migrations/0026_job_creator_system_settings/migration.sql +14 -0
  288. package/prisma/migrations/0027_chrome_regions/down.sql +24 -0
  289. package/prisma/migrations/0027_chrome_regions/migration.sql +16 -0
  290. package/prisma/schema.prisma +105 -15
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Jobs API shapes from the October 2026 handoff (docs/design/prenta/DATA_CONTRACTS.md §1).
3
+ *
4
+ * Storage keeps its own format (progress as `{completed,total,message}`, batch
5
+ * AI payloads as `items`). `serialize.ts` maps rows to these shapes at the
6
+ * edge. See CONFLICTS.md §4.
7
+ */
8
+ import type { JobEventKind, JobStatus } from './types.js';
9
+ export type { JobEventKind, JobStatus };
10
+ export type JobType = 'seo-scan' | 'content-health' | 'batch-ai';
11
+ export interface UserRef {
12
+ id: string;
13
+ name: string;
14
+ initials: string;
15
+ }
16
+ /** `createdBy` for a job a cron queued. */
17
+ export interface CronRef {
18
+ kind: 'cron';
19
+ schedule: 'weekly-seo' | 'nightly-health';
20
+ }
21
+ export interface JobProgressView {
22
+ done: number;
23
+ total: number;
24
+ unit: 'pages' | 'documents';
25
+ /** Where the handler continues from: the scan offset, document cursor or batch index. */
26
+ cursor: string | null;
27
+ /** The stored count, the same as `done`. Kept for screens that read it. */
28
+ completed: number;
29
+ /** The stored progress note, such as "Scanned 40 of 120 pages". */
30
+ message?: string;
31
+ }
32
+ export interface BatchAiPayload {
33
+ operation: 'meta' | 'alt' | 'titles' | 'excerpt' | 'links' | 'custom';
34
+ instruction: string | null;
35
+ /** Post type key. */
36
+ source: string;
37
+ statusFilter: 'published' | 'all';
38
+ /** Resolved when queued, then never changed. */
39
+ documentIds: string[];
40
+ /** `auto` requires the admin role. */
41
+ review: 'review' | 'auto';
42
+ onApprove: 'draft' | 'publish';
43
+ /** Custom instruction only: the field it rewrites. Not in the kit's contract. */
44
+ field?: BatchAiTextField;
45
+ }
46
+ /** The document fields a custom instruction can rewrite. */
47
+ export type BatchAiTextField = 'metaDescription' | 'seoTitle' | 'excerpt';
48
+ /** Which documents a batch runs on, beyond `source` and `statusFilter`. */
49
+ export interface BatchAiFilter {
50
+ /**
51
+ * Run on these documents (or images) only, as picked in a list's bulk
52
+ * actions. Without them, the operation's preset picks, such as "missing or
53
+ * over 160 characters".
54
+ */
55
+ documentIds?: string[];
56
+ }
57
+ /**
58
+ * Body of `POST /jobs/batch-ai` and `POST /jobs/batch-ai/preview`. The query of
59
+ * `GET /jobs/batch-ai/estimate` carries the same fields, with `documentIds`
60
+ * comma-separated.
61
+ */
62
+ export type BatchAiRequest = Omit<BatchAiPayload, 'documentIds'> & {
63
+ filter?: BatchAiFilter;
64
+ };
65
+ export interface BatchAiEstimate {
66
+ count: number;
67
+ sample: {
68
+ title: string;
69
+ url: string;
70
+ }[];
71
+ /** About 900 per document. */
72
+ tokens: number;
73
+ /** About one per document. */
74
+ minutes: number;
75
+ /** Null when Settings → AI sets no monthly limit. */
76
+ pctOfMonthlyLimit: number | null;
77
+ }
78
+ export interface BatchAiPreviewItem {
79
+ documentId: string;
80
+ title: string;
81
+ after: string;
82
+ }
83
+ export interface ScanPayload {
84
+ trigger: 'cron' | 'manual';
85
+ }
86
+ export interface ScanResults {
87
+ score?: number;
88
+ prevScore?: number;
89
+ /** SEO: issues found. Content health: new issues. */
90
+ found: number;
91
+ /** SEO: issues fixed since the last scan. Content health: resolved issues. */
92
+ resolved: number;
93
+ categories: {
94
+ key: string;
95
+ label: string;
96
+ count: number;
97
+ href: string;
98
+ }[];
99
+ digest?: {
100
+ sentAt: string;
101
+ recipients: number;
102
+ } | null;
103
+ }
104
+ export interface Job {
105
+ id: string;
106
+ /** A {@link JobType}, or an unknown type the screen shows as a generic tile. */
107
+ type: string;
108
+ status: JobStatus;
109
+ title: string;
110
+ scope: string;
111
+ /** Next eligible run. While retrying, the end of the backoff. */
112
+ runAt: string;
113
+ /** Failures counted against `maxAttempts`. Yields don't count. */
114
+ attempts: number;
115
+ maxAttempts: number;
116
+ progress: JobProgressView;
117
+ /**
118
+ * One summary line. The detail sends the full message and stack (up to 4 KB),
119
+ * but only to a caller who could retry or cancel the job.
120
+ */
121
+ lastError: string | null;
122
+ explain: string | null;
123
+ summary: string | null;
124
+ lockedAt: string | null;
125
+ cancelRequestedAt: string | null;
126
+ cancelledBy: UserRef | null;
127
+ /** Null only for a job of an unknown type queued without a user. */
128
+ createdBy: UserRef | CronRef | null;
129
+ createdAt: string;
130
+ updatedAt: string;
131
+ finishedAt: string | null;
132
+ usage: {
133
+ tokensIn: number;
134
+ tokensOut: number;
135
+ };
136
+ /** Empty for an unknown type. */
137
+ payload: BatchAiPayload | ScanPayload | Record<string, never>;
138
+ /** Scans only, in the detail response. */
139
+ results?: ScanResults;
140
+ /** Batch AI only. Counted from the job's review items. */
141
+ review?: {
142
+ pending: number;
143
+ approved: number;
144
+ rejected: number;
145
+ };
146
+ }
147
+ export interface JobReviewItem {
148
+ id: string;
149
+ jobId: string;
150
+ documentId: string;
151
+ documentTitle: string;
152
+ url: string;
153
+ field: 'metaDescription' | 'altText' | 'seoTitle' | 'excerpt' | 'body' | (string & {});
154
+ before: string;
155
+ after: string;
156
+ editedAfter: string | null;
157
+ status: 'pending' | 'approved' | 'rejected';
158
+ decidedBy: UserRef | null;
159
+ decidedAt: string | null;
160
+ /** The document history revision created when the change was applied. */
161
+ appliedRevisionId: string | null;
162
+ }
163
+ export interface JobEvent {
164
+ at: string;
165
+ kind: JobEventKind;
166
+ message: string;
167
+ detail?: string;
168
+ durationMs?: number;
169
+ tokens?: number;
170
+ }
171
+ export interface JobWorkerSchedule {
172
+ type: 'seo-scan' | 'content-health';
173
+ cron: string;
174
+ nextAt: string;
175
+ /** The queued or running job of this type. "Run now" opens it instead of adding one. */
176
+ activeJobId: string | null;
177
+ }
178
+ export interface JobWorkerStatus {
179
+ /** Null until the worker has run once since 0026. */
180
+ lastTickAt: string | null;
181
+ lastTickMs: number | null;
182
+ nextTickAt: string | null;
183
+ budgetMs: number;
184
+ schedules: JobWorkerSchedule[];
185
+ }
186
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/jobs/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/jobs/contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ /** How the queue records a thrown value. */
2
+ export interface ErrorDescription {
3
+ /** For `lastError`: the message and stack, cut to 4 KB keeping the message's end. */
4
+ text: string;
5
+ /** For the job list and the activity log, taken from the uncut message. */
6
+ summary: string | null;
7
+ }
8
+ /**
9
+ * What the queue stores for a thrown value: its stack, which starts with the
10
+ * name and message, cut to 4 KB so the end of a long message (where Prisma puts
11
+ * the cause) survives. The summary comes from the uncut message.
12
+ */
13
+ export declare function describeError(err: unknown): ErrorDescription;
14
+ /** Cut a stored error string to 4 KB, keeping its start and its end. */
15
+ export declare function clipError(text: string): string;
16
+ /**
17
+ * One line that says what went wrong, or null when there is nothing to say.
18
+ * Stack frames and blank lines are skipped, so a message that starts with a
19
+ * newline still has a summary. For a Prisma error that is the last line,
20
+ * otherwise the first.
21
+ */
22
+ export declare function errorSummary(text: string | null | undefined): string | null;
23
+ //# sourceMappingURL=error-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-text.d.ts","sourceRoot":"","sources":["../../src/jobs/error-text.ts"],"names":[],"mappings":"AAeA,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAA;IACZ,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AA8DD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAM5D;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS3E"}
@@ -0,0 +1,110 @@
1
+ /** DATA_CONTRACTS §1: `lastError` is the full message and stack, trimmed to 4 KB. */
2
+ const LAST_ERROR_MAX = 4096;
3
+ /** Stack frames keep at least this much room when a long message is cut. */
4
+ const FRAMES_MIN = 1024;
5
+ /** How much of a long message's end is kept, so the cause on its last lines survives. */
6
+ const TAIL_MAX = 1024;
7
+ const CUT_MARKER = '\n…\n';
8
+ /** The one-line form in the job list and the activity log. */
9
+ const SUMMARY_MAX = 300;
10
+ /** V8 frames: `at fn (file:1:2)`, `at file:1:2`, `at <anonymous>`, `at async Promise.all (index 0)`. */
11
+ const STACK_FRAME = /^at\s.*(:\d+(:\d+)?\)?|<anonymous>\)?|\(native\)|\(index \d+\))$/;
12
+ /** Prisma prints the call site first and the cause on the last line. */
13
+ const PRISMA_INVOCATION = /Invalid `[^`]+` invocation/;
14
+ /** Whole lines from the start of `text`, up to `max` characters. */
15
+ function leadingLines(text, max) {
16
+ if (text.length <= max)
17
+ return text;
18
+ const kept = [];
19
+ let length = 0;
20
+ for (const line of text.split('\n')) {
21
+ const next = length + (kept.length > 0 ? 1 : 0) + line.length;
22
+ if (next > max)
23
+ break;
24
+ kept.push(line);
25
+ length = next;
26
+ }
27
+ return kept.join('\n');
28
+ }
29
+ /** The start and the end of `text`, with a marker between, in `max` characters. */
30
+ function headAndTail(text, max) {
31
+ if (text.length <= max)
32
+ return text;
33
+ const room = max - CUT_MARKER.length;
34
+ let tail = text.slice(-Math.min(TAIL_MAX, Math.floor(room / 2)));
35
+ // Start the tail on a whole line when there is one to start on.
36
+ const lineStart = tail.indexOf('\n');
37
+ if (lineStart >= 0 && lineStart < tail.length - 1)
38
+ tail = tail.slice(lineStart + 1);
39
+ return `${text.slice(0, room - tail.length)}${CUT_MARKER}${tail}`;
40
+ }
41
+ /**
42
+ * Fit a message and its stack frames into 4 KB. The frames get what the message
43
+ * leaves, but at least {@link FRAMES_MIN}. A message that is still too long
44
+ * keeps its start and its end.
45
+ */
46
+ function fitError(message, frames) {
47
+ if (message.length + (frames ? frames.length + 1 : 0) <= LAST_ERROR_MAX) {
48
+ return frames ? `${message}\n${frames}` : message;
49
+ }
50
+ const keptFrames = frames
51
+ ? leadingLines(frames, Math.max(FRAMES_MIN, LAST_ERROR_MAX - message.length - 1))
52
+ : '';
53
+ const kept = headAndTail(message, LAST_ERROR_MAX - (keptFrames ? keptFrames.length + 1 : 0));
54
+ return keptFrames ? `${kept}\n${keptFrames}` : kept;
55
+ }
56
+ /** Split a thrown value into its name and message, and its stack frames. */
57
+ function errorParts(err) {
58
+ if (!(err instanceof Error))
59
+ return { message: String(err), frames: '' };
60
+ const stack = typeof err.stack === 'string' ? err.stack : '';
61
+ if (!err.message) {
62
+ // The stack's first line is just the name.
63
+ const lineEnd = stack.indexOf('\n');
64
+ if (lineEnd < 0)
65
+ return { message: stack || err.name, frames: '' };
66
+ return { message: stack.slice(0, lineEnd), frames: stack.slice(lineEnd + 1) };
67
+ }
68
+ const at = stack.indexOf(err.message);
69
+ if (at >= 0) {
70
+ const end = at + err.message.length;
71
+ return { message: stack.slice(0, end), frames: stack.slice(end).replace(/^\n/, '') };
72
+ }
73
+ // No stack, or a message changed after the stack was formatted: keep both.
74
+ return { message: err.message, frames: stack };
75
+ }
76
+ /**
77
+ * What the queue stores for a thrown value: its stack, which starts with the
78
+ * name and message, cut to 4 KB so the end of a long message (where Prisma puts
79
+ * the cause) survives. The summary comes from the uncut message.
80
+ */
81
+ export function describeError(err) {
82
+ const { message, frames } = errorParts(err);
83
+ return {
84
+ text: fitError(message, frames),
85
+ summary: errorSummary(frames ? `${message}\n${frames}` : message),
86
+ };
87
+ }
88
+ /** Cut a stored error string to 4 KB, keeping its start and its end. */
89
+ export function clipError(text) {
90
+ return fitError(text, '');
91
+ }
92
+ /**
93
+ * One line that says what went wrong, or null when there is nothing to say.
94
+ * Stack frames and blank lines are skipped, so a message that starts with a
95
+ * newline still has a summary. For a Prisma error that is the last line,
96
+ * otherwise the first.
97
+ */
98
+ export function errorSummary(text) {
99
+ if (!text)
100
+ return null;
101
+ const lines = text
102
+ .split('\n')
103
+ .map((line) => line.trim())
104
+ .filter((line) => line.length > 0 && !STACK_FRAME.test(line));
105
+ const line = PRISMA_INVOCATION.test(text) ? lines.at(-1) : lines[0];
106
+ if (!line)
107
+ return null;
108
+ return line.length > SUMMARY_MAX ? `${line.slice(0, SUMMARY_MAX - 1)}…` : line;
109
+ }
110
+ //# sourceMappingURL=error-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-text.js","sourceRoot":"","sources":["../../src/jobs/error-text.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAQrD,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAA;AAgBzD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAkG1E"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUrD,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAA;AAgBnE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAwI1E"}
@@ -1,8 +1,11 @@
1
- import { applyBatchAiItem, readBatchAiItem } from '../ai/batch-list.js';
1
+ import { linkTargetLoader } from '../ai/batch-links.js';
2
+ import { AiCapRefusal, applyBatchAiItem, readBatchAiItem } from '../ai/batch-list.js';
2
3
  import { processContentHealthScan, resolveUnseenContentIssues } from '../content-health/cron.js';
3
4
  import { getPrentaConfig } from '../config/runtime.js';
4
5
  import { maybeSendSeoDigest } from '../seo/digest.js';
5
6
  import { AUDIT_QUEUE_SLICE, frontEndContentCollectionTypes, runAuditSlice, sweepStaleAuditRuns, } from '../seo/audit-runner.js';
7
+ import { contentHealthResults, seoScanResults } from './outcomes.js';
8
+ import { recordReviewSuggestion } from './review.js';
6
9
  /** Documents per content-health slice. Small enough to finish inside the worker budget. */
7
10
  const CONTENT_HEALTH_SLICE = 25;
8
11
  function siteOrigin() {
@@ -15,6 +18,8 @@ function stringList(value) {
15
18
  : [];
16
19
  }
17
20
  export function createJobHandlers(db) {
21
+ // The pages a `links` batch can link to, shared by every slice for a few minutes.
22
+ const linkTargets = linkTargetLoader(db);
18
23
  return {
19
24
  'seo-scan': async (job) => {
20
25
  const skip = typeof job.payload.skip === 'number' ? job.payload.skip : 0;
@@ -45,13 +50,19 @@ export function createJobHandlers(db) {
45
50
  payload: { ...job.payload, runId: slice.runId, skip: slice.pagesScanned },
46
51
  };
47
52
  }
48
- if (!slice.skipped)
49
- await maybeSendSeoDigest(db).catch(() => ({ sent: false }));
50
- return { done: true, progress };
53
+ // Another audit was already running, so this job has no run of its own to report.
54
+ if (slice.skipped)
55
+ return { done: true, progress };
56
+ // Rule 3: send the digest, then save the results, which record it. The
57
+ // queue writes the AI summary after the success is saved.
58
+ const digest = await maybeSendSeoDigest(db).catch(() => ({ sent: false }));
59
+ const results = await seoScanResults(db, slice.runId, digest, new Date());
60
+ return { done: true, progress, ...(results ? { results } : {}) };
51
61
  },
52
62
  'content-health': async (job) => {
53
63
  const seen = new Set(stringList(job.payload.seen));
54
64
  const scannedBefore = typeof job.payload.scanned === 'number' ? job.payload.scanned : 0;
65
+ const foundBefore = typeof job.payload.found === 'number' ? job.payload.found : 0;
55
66
  const cursor = typeof job.payload.cursor === 'string' ? job.payload.cursor : undefined;
56
67
  const result = await processContentHealthScan(db, {
57
68
  maxDocuments: CONTENT_HEALTH_SLICE,
@@ -61,6 +72,7 @@ export function createJobHandlers(db) {
61
72
  siteOrigin: siteOrigin(),
62
73
  });
63
74
  const scanned = scannedBefore + result.scanned;
75
+ const found = foundBefore + result.inserted;
64
76
  const progress = {
65
77
  completed: scanned,
66
78
  total: result.truncated ? scanned + 1 : scanned,
@@ -77,16 +89,19 @@ export function createJobHandlers(db) {
77
89
  cursor: result.cursor,
78
90
  seen: result.seenKeys,
79
91
  scanned,
92
+ found,
80
93
  },
81
94
  };
82
95
  }
83
96
  const resolved = await resolveUnseenContentIssues(db, result.seenKeys);
97
+ const results = await contentHealthResults(db, { found, resolved });
84
98
  return {
85
99
  done: true,
86
100
  progress: {
87
101
  ...progress,
88
102
  message: `Scanned ${scanned} documents, resolved ${resolved}`,
89
103
  },
104
+ ...(results ? { results } : {}),
90
105
  };
91
106
  },
92
107
  'batch-ai': async (job) => {
@@ -99,8 +114,33 @@ export function createJobHandlers(db) {
99
114
  };
100
115
  }
101
116
  const current = readBatchAiItem(items[index]);
102
- if (current)
103
- await applyBatchAiItem(db, current);
117
+ let usage;
118
+ if (current) {
119
+ try {
120
+ // Review mode stores a suggestion; anything else (including rows queued
121
+ // by /ai/batch, which have no mode) writes the document now.
122
+ const options = {
123
+ field: typeof job.payload.field === 'string' ? job.payload.field : null,
124
+ instruction: typeof job.payload.instruction === 'string' ? job.payload.instruction : null,
125
+ linkTargets,
126
+ };
127
+ usage =
128
+ job.payload.review === 'review'
129
+ ? await recordReviewSuggestion(db, job.id, current, options)
130
+ : (await applyBatchAiItem(db, current, options)).usage;
131
+ }
132
+ catch (err) {
133
+ if (!(err instanceof AiCapRefusal))
134
+ throw err;
135
+ // A spent cap isn't a failure: wait for it to reset, then retry this document.
136
+ return {
137
+ done: false,
138
+ progress: { completed: index, total: items.length, message: err.message },
139
+ wait: { until: err.resetsAt, reason: err.message },
140
+ usage: err.usage,
141
+ };
142
+ }
143
+ }
104
144
  const next = index + 1;
105
145
  const progress = {
106
146
  completed: next,
@@ -108,11 +148,12 @@ export function createJobHandlers(db) {
108
148
  message: `Processed ${next} of ${items.length}`,
109
149
  };
110
150
  if (next >= items.length)
111
- return { done: true, progress };
151
+ return { done: true, progress, usage };
112
152
  return {
113
153
  done: false,
114
154
  progress,
115
155
  payload: { ...job.payload, index: next },
156
+ usage,
116
157
  };
117
158
  },
118
159
  };
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,37 @@
1
- import type { JobRecord, JobStore } from './types.js';
1
+ import type { JobEventRecord, JobListFilter, JobNote, JobRecord, JobStore, JobUsage, PruneLimit } from './types.js';
2
2
  /** In-process store for the queue tests. Production uses {@link PrismaJobStore}. */
3
3
  export declare class MemoryJobStore implements JobStore {
4
+ private readonly reviewItems;
4
5
  private readonly jobs;
6
+ private readonly events;
7
+ /**
8
+ * @param reviewItems The live `job_review_items` rows (`jobId`, `status`,
9
+ * `decidedAt`) of a test that drives review items, so retention keeps a
10
+ * job for them like the Prisma store does, and deletes them with it.
11
+ */
12
+ constructor(reviewItems?: () => Array<Record<string, unknown>>);
5
13
  insert(job: JobRecord): Promise<void>;
6
14
  findActive(type: string): Promise<JobRecord | null>;
7
15
  claimNext(now: Date): Promise<JobRecord | null>;
8
16
  findStaleRunning(cutoff: Date): Promise<JobRecord[]>;
17
+ /** Keeps the stored cancel fields and creator, like {@link PrismaJobStore.save}. */
9
18
  save(job: JobRecord): Promise<void>;
10
- list(limit: number): Promise<JobRecord[]>;
19
+ requestCancel(id: string, at: Date, byId: string | null): Promise<boolean>;
20
+ finishCancel(job: JobRecord): Promise<boolean>;
21
+ findPendingNotes(since: Date, summaryTypes: readonly string[], limit: number): Promise<JobRecord[]>;
22
+ claimNote(id: string, note: JobNote, finishedAt: Date): Promise<boolean>;
23
+ writeNote(id: string, note: JobNote, finishedAt: Date, text: string, usage?: JobUsage): Promise<boolean>;
24
+ retry(id: string, now: Date): Promise<boolean>;
25
+ get(id: string): Promise<JobRecord | null>;
26
+ findCancelRequested(): Promise<JobRecord[]>;
27
+ pruneFinished(cutoff: Date, limit: PruneLimit): Promise<number>;
28
+ list(limit: number, filter?: JobListFilter): Promise<JobRecord[]>;
29
+ addEvent(event: JobEventRecord): Promise<void>;
30
+ listEvents(jobId: string, limit: number): Promise<JobEventRecord[]>;
31
+ trimEvents(jobId: string, keep: number): Promise<number>;
32
+ private removeEvents;
33
+ /** The stored job if it is still the finish a note belongs to. */
34
+ private sameFinish;
11
35
  private clone;
12
36
  }
13
37
  //# sourceMappingURL=memory-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErD,oFAAoF;AACpF,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IAE9C,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASnD,SAAS,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAe/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAWpD,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO/C,OAAO,CAAC,KAAK;CAWd"}
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,OAAO,EACP,SAAS,EAET,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAA;AAKnB,oFAAoF;AACpF,qBAAa,cAAe,YAAW,QAAQ;IASjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IARxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C;;;;OAIG;gBAC0B,WAAW,GAAE,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAY;IAEnF,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASnD,SAAS,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAe/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAW1D,oFAAoF;IAC9E,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,gBAAgB,CACpB,KAAK,EAAE,IAAI,EACX,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,EAAE,CAAC;IAajB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxE,SAAS,CACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,QAAQ,GACf,OAAO,CAAC,OAAO,CAAC;IAYb,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB9C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK1C,mBAAmB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAM3C,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC/D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASrE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQnE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9D,OAAO,CAAC,YAAY;IAKpB,kEAAkE;IAClE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,KAAK;CAad"}