@kywi-software/core 0.2.1 → 0.3.1

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 (354) hide show
  1. package/README.md +57 -2
  2. package/dist/admin/app.d.ts +10 -1
  3. package/dist/admin/app.d.ts.map +1 -1
  4. package/dist/admin/app.js +2 -2
  5. package/dist/admin/app.js.map +1 -1
  6. package/dist/admin/approval-queue.d.ts +3 -1
  7. package/dist/admin/approval-queue.d.ts.map +1 -1
  8. package/dist/admin/approval-queue.js +2 -2
  9. package/dist/admin/approval-queue.js.map +1 -1
  10. package/dist/admin/audience-list.d.ts.map +1 -1
  11. package/dist/admin/audience-list.js +9 -1
  12. package/dist/admin/audience-list.js.map +1 -1
  13. package/dist/admin/chrome.d.ts +7 -1
  14. package/dist/admin/chrome.d.ts.map +1 -1
  15. package/dist/admin/chrome.js +2 -1
  16. package/dist/admin/chrome.js.map +1 -1
  17. package/dist/admin/content-editor-api.d.ts +27 -1
  18. package/dist/admin/content-editor-api.d.ts.map +1 -1
  19. package/dist/admin/content-editor-api.js +60 -2
  20. package/dist/admin/content-editor-api.js.map +1 -1
  21. package/dist/admin/content-form.d.ts +62 -6
  22. package/dist/admin/content-form.d.ts.map +1 -1
  23. package/dist/admin/content-form.js +118 -13
  24. package/dist/admin/content-form.js.map +1 -1
  25. package/dist/admin/content-permissions-tab.d.ts +13 -0
  26. package/dist/admin/content-permissions-tab.d.ts.map +1 -0
  27. package/dist/admin/content-permissions-tab.js +90 -0
  28. package/dist/admin/content-permissions-tab.js.map +1 -0
  29. package/dist/admin/context.d.ts +8 -0
  30. package/dist/admin/context.d.ts.map +1 -1
  31. package/dist/admin/context.js.map +1 -1
  32. package/dist/admin/feed-builder.d.ts.map +1 -1
  33. package/dist/admin/feed-builder.js +20 -1
  34. package/dist/admin/feed-builder.js.map +1 -1
  35. package/dist/admin/field-components.d.ts.map +1 -1
  36. package/dist/admin/field-components.js +26 -1
  37. package/dist/admin/field-components.js.map +1 -1
  38. package/dist/admin/form-builder.js +6 -1
  39. package/dist/admin/form-builder.js.map +1 -1
  40. package/dist/admin/form-helpers.d.ts.map +1 -1
  41. package/dist/admin/form-helpers.js +2 -0
  42. package/dist/admin/form-helpers.js.map +1 -1
  43. package/dist/admin/layout-editor/component-actions.d.ts +18 -0
  44. package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
  45. package/dist/admin/layout-editor/component-actions.js +19 -0
  46. package/dist/admin/layout-editor/component-actions.js.map +1 -1
  47. package/dist/admin/layout-editor/component-picker-field.d.ts +20 -0
  48. package/dist/admin/layout-editor/component-picker-field.d.ts.map +1 -0
  49. package/dist/admin/layout-editor/component-picker-field.js +16 -0
  50. package/dist/admin/layout-editor/component-picker-field.js.map +1 -0
  51. package/dist/admin/layout-editor/drag-utils.d.ts +48 -0
  52. package/dist/admin/layout-editor/drag-utils.d.ts.map +1 -1
  53. package/dist/admin/layout-editor/drag-utils.js +43 -0
  54. package/dist/admin/layout-editor/drag-utils.js.map +1 -1
  55. package/dist/admin/layout-editor/editor-canvas.d.ts +9 -1
  56. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  57. package/dist/admin/layout-editor/editor-canvas.js +41 -15
  58. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  59. package/dist/admin/layout-editor/editor-state.d.ts +9 -1
  60. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  61. package/dist/admin/layout-editor/editor-state.js +34 -0
  62. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  63. package/dist/admin/layout-editor/editor.css +83 -0
  64. package/dist/admin/layout-editor/form-picker-field.d.ts +17 -0
  65. package/dist/admin/layout-editor/form-picker-field.d.ts.map +1 -0
  66. package/dist/admin/layout-editor/form-picker-field.js +35 -0
  67. package/dist/admin/layout-editor/form-picker-field.js.map +1 -0
  68. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  69. package/dist/admin/layout-editor/layout-editor.js +95 -28
  70. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  71. package/dist/admin/layout-editor/mode-toggle.d.ts.map +1 -1
  72. package/dist/admin/layout-editor/mode-toggle.js +1 -1
  73. package/dist/admin/layout-editor/mode-toggle.js.map +1 -1
  74. package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
  75. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  76. package/dist/admin/layout-editor/module-overlay.js +3 -3
  77. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  78. package/dist/admin/layout-editor/props-panel.d.ts +10 -1
  79. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  80. package/dist/admin/layout-editor/props-panel.js +25 -2
  81. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  82. package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
  83. package/dist/admin/layout-editor/section-insert-line.js +1 -1
  84. package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
  85. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  86. package/dist/admin/layout-editor/section-overlay.js +1 -1
  87. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  88. package/dist/admin/layout-editor/section-template-picker.d.ts +9 -1
  89. package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
  90. package/dist/admin/layout-editor/section-template-picker.js +45 -2
  91. package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
  92. package/dist/admin/registry.d.ts.map +1 -1
  93. package/dist/admin/registry.js +11 -0
  94. package/dist/admin/registry.js.map +1 -1
  95. package/dist/admin/server.d.ts +15 -2
  96. package/dist/admin/server.d.ts.map +1 -1
  97. package/dist/admin/server.js +37 -1
  98. package/dist/admin/server.js.map +1 -1
  99. package/dist/admin/styles/admin.css +16 -4
  100. package/dist/admin/surface-matcher.d.ts +27 -0
  101. package/dist/admin/surface-matcher.d.ts.map +1 -1
  102. package/dist/admin/surface-matcher.js +11 -0
  103. package/dist/admin/surface-matcher.js.map +1 -1
  104. package/dist/admin/surfaces/approvals/approvals-data.d.ts +29 -9
  105. package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -1
  106. package/dist/admin/surfaces/approvals/approvals-data.js +65 -22
  107. package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -1
  108. package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -1
  109. package/dist/admin/surfaces/approvals/approvals-index.js +47 -14
  110. package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -1
  111. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
  112. package/dist/admin/surfaces/content/content-edit.js +34 -8
  113. package/dist/admin/surfaces/content/content-edit.js.map +1 -1
  114. package/dist/admin/surfaces/content/content-index.d.ts.map +1 -1
  115. package/dist/admin/surfaces/content/content-index.js +29 -2
  116. package/dist/admin/surfaces/content/content-index.js.map +1 -1
  117. package/dist/admin/surfaces/content/content-new.d.ts.map +1 -1
  118. package/dist/admin/surfaces/content/content-new.js +6 -4
  119. package/dist/admin/surfaces/content/content-new.js.map +1 -1
  120. package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -1
  121. package/dist/admin/surfaces/contentTree/content-tree.js +25 -2
  122. package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -1
  123. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -1
  124. package/dist/admin/surfaces/contentTypes/content-types-designer.js +78 -47
  125. package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -1
  126. package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -1
  127. package/dist/admin/surfaces/feeds/feed-editor.js +21 -4
  128. package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -1
  129. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
  130. package/dist/admin/surfaces/layouts/layout-editor-client.js +7 -4
  131. package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
  132. package/dist/admin/surfaces/media/media-client.d.ts.map +1 -1
  133. package/dist/admin/surfaces/media/media-client.js +10 -2
  134. package/dist/admin/surfaces/media/media-client.js.map +1 -1
  135. package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -1
  136. package/dist/admin/surfaces/settings/settings-site.js +39 -2
  137. package/dist/admin/surfaces/settings/settings-site.js.map +1 -1
  138. package/dist/admin/surfaces/settings/settings-sites.js +18 -0
  139. package/dist/admin/surfaces/settings/settings-sites.js.map +1 -1
  140. package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -1
  141. package/dist/admin/surfaces/trash/trash-index.js +45 -8
  142. package/dist/admin/surfaces/trash/trash-index.js.map +1 -1
  143. package/dist/admin/surfaces/users/users-data.d.ts +11 -0
  144. package/dist/admin/surfaces/users/users-data.d.ts.map +1 -1
  145. package/dist/admin/surfaces/users/users-data.js +20 -1
  146. package/dist/admin/surfaces/users/users-data.js.map +1 -1
  147. package/dist/admin/surfaces/webServices/web-services-data.d.ts +11 -1
  148. package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -1
  149. package/dist/admin/surfaces/webServices/web-services-data.js +13 -0
  150. package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -1
  151. package/dist/admin/surfaces/webServices/webhooks.d.ts +3 -0
  152. package/dist/admin/surfaces/webServices/webhooks.d.ts.map +1 -0
  153. package/dist/admin/surfaces/webServices/webhooks.js +69 -0
  154. package/dist/admin/surfaces/webServices/webhooks.js.map +1 -0
  155. package/dist/admin/webhook-manager.d.ts +32 -0
  156. package/dist/admin/webhook-manager.d.ts.map +1 -0
  157. package/dist/admin/webhook-manager.js +62 -0
  158. package/dist/admin/webhook-manager.js.map +1 -0
  159. package/dist/api/admin-features-routes.d.ts.map +1 -1
  160. package/dist/api/admin-features-routes.js +30 -0
  161. package/dist/api/admin-features-routes.js.map +1 -1
  162. package/dist/api/api-key-routes.d.ts.map +1 -1
  163. package/dist/api/api-key-routes.js +6 -1
  164. package/dist/api/api-key-routes.js.map +1 -1
  165. package/dist/api/auth.d.ts +8 -0
  166. package/dist/api/auth.d.ts.map +1 -1
  167. package/dist/api/auth.js +11 -1
  168. package/dist/api/auth.js.map +1 -1
  169. package/dist/api/comment-routes.d.ts.map +1 -1
  170. package/dist/api/comment-routes.js +102 -47
  171. package/dist/api/comment-routes.js.map +1 -1
  172. package/dist/api/config-routes.d.ts +10 -2
  173. package/dist/api/config-routes.d.ts.map +1 -1
  174. package/dist/api/config-routes.js +46 -25
  175. package/dist/api/config-routes.js.map +1 -1
  176. package/dist/api/content-routes.d.ts.map +1 -1
  177. package/dist/api/content-routes.js +41 -0
  178. package/dist/api/content-routes.js.map +1 -1
  179. package/dist/api/content-schemas.d.ts.map +1 -1
  180. package/dist/api/content-schemas.js +34 -1
  181. package/dist/api/content-schemas.js.map +1 -1
  182. package/dist/api/content-type-routes.d.ts.map +1 -1
  183. package/dist/api/content-type-routes.js +58 -3
  184. package/dist/api/content-type-routes.js.map +1 -1
  185. package/dist/api/feed-routes.d.ts +180 -0
  186. package/dist/api/feed-routes.d.ts.map +1 -1
  187. package/dist/api/feed-routes.js +10 -2
  188. package/dist/api/feed-routes.js.map +1 -1
  189. package/dist/api/form-routes.d.ts +6 -0
  190. package/dist/api/form-routes.d.ts.map +1 -1
  191. package/dist/api/form-routes.js +93 -14
  192. package/dist/api/form-routes.js.map +1 -1
  193. package/dist/api/graphql/resolvers.d.ts +4 -4
  194. package/dist/api/index.d.ts.map +1 -1
  195. package/dist/api/index.js +12 -1
  196. package/dist/api/index.js.map +1 -1
  197. package/dist/api/media-routes.d.ts.map +1 -1
  198. package/dist/api/media-routes.js +18 -1
  199. package/dist/api/media-routes.js.map +1 -1
  200. package/dist/api/webhook-routes.d.ts.map +1 -1
  201. package/dist/api/webhook-routes.js +19 -2
  202. package/dist/api/webhook-routes.js.map +1 -1
  203. package/dist/api/workflow-routes.d.ts.map +1 -1
  204. package/dist/api/workflow-routes.js +163 -4
  205. package/dist/api/workflow-routes.js.map +1 -1
  206. package/dist/auth/roles.d.ts +28 -0
  207. package/dist/auth/roles.d.ts.map +1 -1
  208. package/dist/auth/roles.js +49 -0
  209. package/dist/auth/roles.js.map +1 -1
  210. package/dist/config/reserved-field-names.d.ts +29 -0
  211. package/dist/config/reserved-field-names.d.ts.map +1 -0
  212. package/dist/config/reserved-field-names.js +59 -0
  213. package/dist/config/reserved-field-names.js.map +1 -0
  214. package/dist/config/types.d.ts +31 -2
  215. package/dist/config/types.d.ts.map +1 -1
  216. package/dist/config/types.js.map +1 -1
  217. package/dist/db/analytics-queries.d.ts +1 -1
  218. package/dist/db/api-key-queries.d.ts +7 -2
  219. package/dist/db/api-key-queries.d.ts.map +1 -1
  220. package/dist/db/api-key-queries.js +8 -2
  221. package/dist/db/api-key-queries.js.map +1 -1
  222. package/dist/db/apply-snapshot.d.ts +58 -0
  223. package/dist/db/apply-snapshot.d.ts.map +1 -0
  224. package/dist/db/apply-snapshot.js +142 -0
  225. package/dist/db/apply-snapshot.js.map +1 -0
  226. package/dist/db/audit-queries.d.ts +3 -3
  227. package/dist/db/category-queries.d.ts +3 -3
  228. package/dist/db/changeset-audit-queries.d.ts +2 -2
  229. package/dist/db/changeset-queries.d.ts +5 -5
  230. package/dist/db/changeset-queries.d.ts.map +1 -1
  231. package/dist/db/changeset-queries.js +24 -7
  232. package/dist/db/changeset-queries.js.map +1 -1
  233. package/dist/db/content-queries.d.ts +6 -0
  234. package/dist/db/content-queries.d.ts.map +1 -1
  235. package/dist/db/content-queries.js +8 -0
  236. package/dist/db/content-queries.js.map +1 -1
  237. package/dist/db/content-type-queries.d.ts +30 -0
  238. package/dist/db/content-type-queries.d.ts.map +1 -1
  239. package/dist/db/content-type-queries.js +98 -1
  240. package/dist/db/content-type-queries.js.map +1 -1
  241. package/dist/db/dashboard-queries.d.ts.map +1 -1
  242. package/dist/db/dashboard-queries.js +5 -1
  243. package/dist/db/dashboard-queries.js.map +1 -1
  244. package/dist/db/dynamic-schema.d.ts.map +1 -1
  245. package/dist/db/dynamic-schema.js +2 -0
  246. package/dist/db/dynamic-schema.js.map +1 -1
  247. package/dist/db/extension-queries.d.ts +8 -8
  248. package/dist/db/feed-queries.d.ts +3 -3
  249. package/dist/db/index.d.ts +3 -0
  250. package/dist/db/index.d.ts.map +1 -1
  251. package/dist/db/index.js +7 -0
  252. package/dist/db/index.js.map +1 -1
  253. package/dist/db/media-queries.d.ts +31 -7
  254. package/dist/db/media-queries.d.ts.map +1 -1
  255. package/dist/db/media-queries.js +13 -1
  256. package/dist/db/media-queries.js.map +1 -1
  257. package/dist/db/membership-dedupe.d.ts +26 -0
  258. package/dist/db/membership-dedupe.d.ts.map +1 -0
  259. package/dist/db/membership-dedupe.js +68 -0
  260. package/dist/db/membership-dedupe.js.map +1 -0
  261. package/dist/db/revision-queries.d.ts +122 -0
  262. package/dist/db/revision-queries.d.ts.map +1 -0
  263. package/dist/db/revision-queries.js +213 -0
  264. package/dist/db/revision-queries.js.map +1 -0
  265. package/dist/db/schema-apply.d.ts +8 -0
  266. package/dist/db/schema-apply.d.ts.map +1 -1
  267. package/dist/db/schema-apply.js +17 -0
  268. package/dist/db/schema-apply.js.map +1 -1
  269. package/dist/db/schema-field-queries.d.ts +2 -0
  270. package/dist/db/schema-field-queries.d.ts.map +1 -1
  271. package/dist/db/schema-field-queries.js +4 -0
  272. package/dist/db/schema-field-queries.js.map +1 -1
  273. package/dist/db/site-plugin-queries.d.ts +2 -2
  274. package/dist/db/user-queries.d.ts +12 -0
  275. package/dist/db/user-queries.d.ts.map +1 -1
  276. package/dist/db/user-queries.js +18 -4
  277. package/dist/db/user-queries.js.map +1 -1
  278. package/dist/db/version-queries.d.ts +37 -0
  279. package/dist/db/version-queries.d.ts.map +1 -1
  280. package/dist/db/version-queries.js +36 -0
  281. package/dist/db/version-queries.js.map +1 -1
  282. package/dist/db/webhook-queries.d.ts +27 -5
  283. package/dist/db/webhook-queries.d.ts.map +1 -1
  284. package/dist/db/webhook-queries.js +17 -0
  285. package/dist/db/webhook-queries.js.map +1 -1
  286. package/dist/db/workflow-queries.d.ts +2 -2
  287. package/dist/experiments/schema.d.ts +1 -1
  288. package/dist/hooks/index.d.ts +1 -1
  289. package/dist/hooks/index.d.ts.map +1 -1
  290. package/dist/hooks/index.js +1 -1
  291. package/dist/hooks/index.js.map +1 -1
  292. package/dist/hooks/webhook-retry.d.ts +22 -1
  293. package/dist/hooks/webhook-retry.d.ts.map +1 -1
  294. package/dist/hooks/webhook-retry.js +38 -1
  295. package/dist/hooks/webhook-retry.js.map +1 -1
  296. package/dist/host/index.d.ts +28 -0
  297. package/dist/host/index.d.ts.map +1 -1
  298. package/dist/host/index.js +56 -1
  299. package/dist/host/index.js.map +1 -1
  300. package/dist/layout/comments-module.d.ts +18 -0
  301. package/dist/layout/comments-module.d.ts.map +1 -0
  302. package/dist/layout/comments-module.js +130 -0
  303. package/dist/layout/comments-module.js.map +1 -0
  304. package/dist/layout/feed-hydration.d.ts +75 -0
  305. package/dist/layout/feed-hydration.d.ts.map +1 -0
  306. package/dist/layout/feed-hydration.js +158 -0
  307. package/dist/layout/feed-hydration.js.map +1 -0
  308. package/dist/layout/index.d.ts +2 -1
  309. package/dist/layout/index.d.ts.map +1 -1
  310. package/dist/layout/index.js +2 -1
  311. package/dist/layout/index.js.map +1 -1
  312. package/dist/layout/module-render-context.d.ts +13 -0
  313. package/dist/layout/module-render-context.d.ts.map +1 -0
  314. package/dist/layout/module-render-context.js +15 -0
  315. package/dist/layout/module-render-context.js.map +1 -0
  316. package/dist/layout/modules-extended.d.ts.map +1 -1
  317. package/dist/layout/modules-extended.js +92 -13
  318. package/dist/layout/modules-extended.js.map +1 -1
  319. package/dist/layout/registry.d.ts.map +1 -1
  320. package/dist/layout/registry.js +22 -6
  321. package/dist/layout/registry.js.map +1 -1
  322. package/dist/layout/renderer.d.ts +17 -1
  323. package/dist/layout/renderer.d.ts.map +1 -1
  324. package/dist/layout/renderer.js +11 -4
  325. package/dist/layout/renderer.js.map +1 -1
  326. package/dist/nav/index.d.ts +1 -0
  327. package/dist/nav/index.d.ts.map +1 -1
  328. package/dist/nav/index.js +4 -0
  329. package/dist/nav/index.js.map +1 -1
  330. package/dist/nav/url-resolver.d.ts +10 -2
  331. package/dist/nav/url-resolver.d.ts.map +1 -1
  332. package/dist/nav/url-resolver.js +17 -3
  333. package/dist/nav/url-resolver.js.map +1 -1
  334. package/dist/schema/base.d.ts +37 -1
  335. package/dist/schema/base.d.ts.map +1 -1
  336. package/dist/schema/base.js +20 -2
  337. package/dist/schema/base.js.map +1 -1
  338. package/dist/schema/generate.d.ts +8 -0
  339. package/dist/schema/generate.d.ts.map +1 -1
  340. package/dist/schema/generate.js +7 -4
  341. package/dist/schema/generate.js.map +1 -1
  342. package/dist/schema/mapper.d.ts.map +1 -1
  343. package/dist/schema/mapper.js +2 -0
  344. package/dist/schema/mapper.js.map +1 -1
  345. package/dist/schema/mysql-tables.d.ts +34 -0
  346. package/dist/schema/mysql-tables.d.ts.map +1 -1
  347. package/dist/schema/mysql-tables.js +14 -2
  348. package/dist/schema/mysql-tables.js.map +1 -1
  349. package/dist/server.d.ts +1 -0
  350. package/dist/server.d.ts.map +1 -1
  351. package/dist/server.js +1 -0
  352. package/dist/server.js.map +1 -1
  353. package/dist/site/styles.css +384 -0
  354. package/package.json +2 -1
@@ -1,4 +1,13 @@
1
1
  import type { KywiDb } from './client.js';
2
+ /**
3
+ * Default per-content version retention. There is no configurable retention
4
+ * concept in the engine (checked: no config field, no schema column), so every
5
+ * save/publish that snapshots a version (see recordContentVersion) keeps at most
6
+ * this many rows per content item and prunes the oldest beyond it. Chosen high
7
+ * enough to cover normal editorial rollback needs without unbounded growth on
8
+ * hot pages. Callers may override per-call.
9
+ */
10
+ export declare const DEFAULT_VERSION_RETENTION = 50;
2
11
  export declare function createVersion(db: KywiDb, data: {
3
12
  contentId: string;
4
13
  siteId: string;
@@ -47,4 +56,32 @@ export declare function getVersionById(db: KywiDb, versionId: string): Promise<{
47
56
  */
48
57
  export declare function deleteContentVersion(db: KywiDb, contentId: string, versionId: string): Promise<boolean>;
49
58
  export declare function getLatestVersionNumber(db: KywiDb, contentId: string): Promise<number>;
59
+ /**
60
+ * Snapshot a content item as its next version and prune history to the retention
61
+ * cap. This is the single entry point for the "every save/publish writes a
62
+ * version" path (#44): the admin editor's direct PUT/PATCH/publish/unpublish had
63
+ * no rollback safety net because only workflow transitions ever created versions.
64
+ *
65
+ * The version number is derived (latest + 1); pass the RESULTING content state as
66
+ * `snapshot`/`status`. After inserting, history is capped to `retention` most
67
+ * recent versions per content item. Returns the created version row.
68
+ */
69
+ export declare function recordContentVersion(db: KywiDb, data: {
70
+ contentId: string;
71
+ siteId: string;
72
+ snapshot: Record<string, unknown>;
73
+ status: string;
74
+ changeNote?: string | undefined;
75
+ createdBy: string | null;
76
+ }, retention?: number): Promise<{
77
+ id: string;
78
+ siteId: string;
79
+ status: string;
80
+ createdAt: Date;
81
+ createdBy: string | null;
82
+ contentId: string;
83
+ version: number;
84
+ snapshot: unknown;
85
+ changeNote: string | null;
86
+ }>;
50
87
  //# sourceMappingURL=version-queries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-queries.d.ts","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;;;;;;;;;;GAkBF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK;;;;;;;;;;KAO3E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;UAOjE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAQjB"}
1
+ {"version":3,"file":"version-queries.d.ts","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAE3C,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;;;;;;;;;;GAkBF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK;;;;;;;;;;KAO3E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;UAOjE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,EACD,SAAS,GAAE,MAAkC;;;;;;;;;;GAgB9C"}
@@ -1,5 +1,15 @@
1
1
  import { eq, desc, and } from 'drizzle-orm';
2
2
  import { kywiContentVersions } from '../schema/base.js';
3
+ import { clearOldVersions } from '../versioning/version-management.js';
4
+ /**
5
+ * Default per-content version retention. There is no configurable retention
6
+ * concept in the engine (checked: no config field, no schema column), so every
7
+ * save/publish that snapshots a version (see recordContentVersion) keeps at most
8
+ * this many rows per content item and prunes the oldest beyond it. Chosen high
9
+ * enough to cover normal editorial rollback needs without unbounded growth on
10
+ * hot pages. Callers may override per-call.
11
+ */
12
+ export const DEFAULT_VERSION_RETENTION = 50;
3
13
  export async function createVersion(db, data) {
4
14
  const values = {
5
15
  contentId: data.contentId,
@@ -55,4 +65,30 @@ export async function getLatestVersionNumber(db, contentId) {
55
65
  .limit(1);
56
66
  return row?.version ?? 0;
57
67
  }
68
+ /**
69
+ * Snapshot a content item as its next version and prune history to the retention
70
+ * cap. This is the single entry point for the "every save/publish writes a
71
+ * version" path (#44): the admin editor's direct PUT/PATCH/publish/unpublish had
72
+ * no rollback safety net because only workflow transitions ever created versions.
73
+ *
74
+ * The version number is derived (latest + 1); pass the RESULTING content state as
75
+ * `snapshot`/`status`. After inserting, history is capped to `retention` most
76
+ * recent versions per content item. Returns the created version row.
77
+ */
78
+ export async function recordContentVersion(db, data, retention = DEFAULT_VERSION_RETENTION) {
79
+ const latest = await getLatestVersionNumber(db, data.contentId);
80
+ const created = await createVersion(db, {
81
+ contentId: data.contentId,
82
+ siteId: data.siteId,
83
+ version: latest + 1,
84
+ snapshot: data.snapshot,
85
+ status: data.status,
86
+ createdBy: data.createdBy,
87
+ ...(data.changeNote !== undefined ? { changeNote: data.changeNote } : {}),
88
+ });
89
+ if (retention > 0) {
90
+ await clearOldVersions(db, data.contentId, retention);
91
+ }
92
+ return created;
93
+ }
58
94
  //# sourceMappingURL=version-queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-queries.js","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,IAQC;IAED,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAA;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;IACtE,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IAE9D,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,mBAAmB,CAAC;SAC3B,MAAM,CAAC,MAAa,CAAC;SACrB,SAAS,EAAE,CAAA;IAEd,OAAO,GAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,SAAiB,EAAE,KAAK,GAAG,EAAE;IAC1E,OAAO,EAAE;SACN,MAAM,EAAE;SACR,IAAI,CAAC,mBAAmB,CAAC;SACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SACnD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;SAC1C,KAAK,CAAC,KAAK,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,SAAiB;IAChE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,EAAE;SACR,IAAI,CAAC,mBAAmB,CAAC;SACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;SAC5C,KAAK,CAAC,CAAC,CAAC,CAAA;IACX,OAAO,GAAG,IAAI,IAAI,CAAA;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU,EACV,SAAiB,EACjB,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,mBAAmB,CAAC;SAC3B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,EACrC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAC7C,CACF;SACA,SAAS,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAU,EACV,SAAiB;IAEjB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,CAAC;SAChD,IAAI,CAAC,mBAAmB,CAAC;SACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SACnD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;SAC1C,KAAK,CAAC,CAAC,CAAC,CAAA;IACX,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAA;AAC1B,CAAC"}
1
+ {"version":3,"file":"version-queries.js","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,11 @@ export declare function createEndpoint(db: KywiDb, data: {
9
9
  id: string;
10
10
  siteId: string;
11
11
  updatedAt: Date;
12
- url: string;
13
12
  createdAt: Date;
14
13
  createdBy: string | null;
15
14
  isActive: boolean;
16
15
  secret: string;
16
+ url: string;
17
17
  events: unknown;
18
18
  }>;
19
19
  export declare function updateEndpoint(db: KywiDb, id: string, data: PartialUndefined<{
@@ -36,33 +36,33 @@ export declare function listEndpoints(db: KywiDb, siteId: string): Promise<{
36
36
  id: string;
37
37
  siteId: string;
38
38
  updatedAt: Date;
39
- url: string;
40
39
  createdAt: Date;
41
40
  createdBy: string | null;
42
41
  isActive: boolean;
43
42
  secret: string;
43
+ url: string;
44
44
  events: unknown;
45
45
  }[]>;
46
46
  export declare function getEndpointById(db: KywiDb, id: string): Promise<{
47
47
  id: string;
48
48
  siteId: string;
49
49
  updatedAt: Date;
50
- url: string;
51
50
  createdAt: Date;
52
51
  createdBy: string | null;
53
52
  isActive: boolean;
54
53
  secret: string;
54
+ url: string;
55
55
  events: unknown;
56
56
  } | null>;
57
57
  export declare function listEndpointsForEvent(db: KywiDb, siteId: string, event: string): Promise<{
58
58
  id: string;
59
59
  siteId: string;
60
60
  updatedAt: Date;
61
- url: string;
62
61
  createdAt: Date;
63
62
  createdBy: string | null;
64
63
  isActive: boolean;
65
64
  secret: string;
65
+ url: string;
66
66
  events: unknown;
67
67
  }[]>;
68
68
  export declare function createDelivery(db: KywiDb, data: {
@@ -72,8 +72,8 @@ export declare function createDelivery(db: KywiDb, data: {
72
72
  }): Promise<{
73
73
  id: string;
74
74
  status: string;
75
- event: string;
76
75
  createdAt: Date;
76
+ event: string;
77
77
  payload: unknown;
78
78
  endpointId: string;
79
79
  httpStatus: number | null;
@@ -102,8 +102,30 @@ export declare function updateDeliveryStatus(db: KywiDb, id: string, data: {
102
102
  export declare function listDeliveries(db: KywiDb, endpointId: string, limit?: number): Promise<{
103
103
  id: string;
104
104
  status: string;
105
+ createdAt: Date;
105
106
  event: string;
107
+ payload: unknown;
108
+ endpointId: string;
109
+ httpStatus: number | null;
110
+ responseBody: string | null;
111
+ attempts: number;
112
+ nextRetryAt: Date | null;
113
+ }[]>;
114
+ /**
115
+ * Deliveries due for a retry: `failed`, with a `nextRetryAt` that has come due,
116
+ * and still under the attempt cap. Ordered oldest-due first and bounded by
117
+ * `limit` so one sweep can't fan out unboundedly. Deliveries that exhaust
118
+ * `maxAttempts` simply stop matching (they are abandoned, not retried forever).
119
+ * The retry worker (`createWebhookRetryWorker`) consumes this.
120
+ */
121
+ export declare function listPendingRetries(db: KywiDb, opts?: {
122
+ maxAttempts?: number;
123
+ limit?: number;
124
+ }): Promise<{
125
+ id: string;
126
+ status: string;
106
127
  createdAt: Date;
128
+ event: string;
107
129
  payload: unknown;
108
130
  endpointId: string;
109
131
  httpStatus: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-queries.d.ts","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;;;;;;;;;;GAaF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gBAAgB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;UAQ7E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;KAK7D;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;UAO3D;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM;;;;;;;;;;KAYd;AAID,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;;;;;;;;;;;GAWF;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC1B;;;;;;;;;;;UAcF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;KAYf"}
1
+ {"version":3,"file":"webhook-queries.d.ts","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;;;;;;;;;;GAaF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gBAAgB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;UAQ7E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;KAK7D;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;UAO3D;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM;;;;;;;;;;KAYd;AAID,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;;;;;;;;;;;GAWF;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC1B;;;;;;;;;;;UAcF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;KAYf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;KAiBhD"}
@@ -86,4 +86,21 @@ export async function listDeliveries(db, endpointId, limit) {
86
86
  }
87
87
  return query;
88
88
  }
89
+ /**
90
+ * Deliveries due for a retry: `failed`, with a `nextRetryAt` that has come due,
91
+ * and still under the attempt cap. Ordered oldest-due first and bounded by
92
+ * `limit` so one sweep can't fan out unboundedly. Deliveries that exhaust
93
+ * `maxAttempts` simply stop matching (they are abandoned, not retried forever).
94
+ * The retry worker (`createWebhookRetryWorker`) consumes this.
95
+ */
96
+ export async function listPendingRetries(db, opts) {
97
+ const maxAttempts = opts?.maxAttempts ?? 10;
98
+ const limit = opts?.limit ?? 100;
99
+ return db
100
+ .select()
101
+ .from(kywiWebhookDeliveries)
102
+ .where(and(eq(kywiWebhookDeliveries.status, 'failed'), sql `${kywiWebhookDeliveries.nextRetryAt} IS NOT NULL`, sql `${kywiWebhookDeliveries.nextRetryAt} <= NOW()`, sql `${kywiWebhookDeliveries.attempts} < ${maxAttempts}`))
103
+ .orderBy(kywiWebhookDeliveries.nextRetryAt)
104
+ .limit(limit);
105
+ }
89
106
  //# sourceMappingURL=webhook-queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-queries.js","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook-queries.js","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"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"}
@@ -114,10 +114,10 @@ export declare function recordApprovalAction(db: KywiDb, data: {
114
114
  comment?: string;
115
115
  }): Promise<{
116
116
  id: string;
117
- action: string;
118
117
  createdAt: Date;
119
118
  contentId: string;
120
119
  userId: string;
120
+ action: string;
121
121
  chainId: string;
122
122
  stepIndex: number;
123
123
  comment: string | null;
@@ -127,10 +127,10 @@ export declare function recordApprovalAction(db: KywiDb, data: {
127
127
  */
128
128
  export declare function getApprovalActions(db: KywiDb, chainId: string, contentId: string): Promise<{
129
129
  id: string;
130
- action: string;
131
130
  createdAt: Date;
132
131
  contentId: string;
133
132
  userId: string;
133
+ action: string;
134
134
  chainId: string;
135
135
  stepIndex: number;
136
136
  comment: string | null;
@@ -126,7 +126,7 @@ export declare const kywiExperiments: import("drizzle-orm/pg-core").PgTableWithC
126
126
  tableName: "kywi_experiments";
127
127
  dataType: "string";
128
128
  columnType: "PgText";
129
- data: "page" | "container";
129
+ data: "container" | "page";
130
130
  driverParam: string;
131
131
  notNull: true;
132
132
  hasDefault: true;
@@ -4,6 +4,6 @@ export { KywiValidationError } from './errors.js';
4
4
  export { loadPluginHooks, loadAllPluginHooks, loadAllPlugins, collectPluginContributions, resolvePluginModule, resolvePluginScopeExtensions, pluginKeyOf, pluginRuntimeConfig, type PluginDefinition, type PluginLoadResult, type PluginRuntimeContext, type PluginHookFn, type PluginActivationChecker, type LoadPluginOptions, type LoadAllPluginsOptions, type AdminExtensions, type AdminNavItem, } from './plugin-loader.js';
5
5
  export { createPluginActivationRegistry, type PluginActivationRegistry } from './plugin-activation.js';
6
6
  export { createApiResponseHookDispatcher, emitLifecycleHook, type ApiResponseHookDispatcher, type LifecycleEvent } from './dispatch.js';
7
- export { createWebhookRetryWorker, type WebhookRetryWorker } from './webhook-retry.js';
7
+ export { createWebhookRetryWorker, startWebhookRetryWorker, type WebhookRetryWorker, type WebhookRetryHandle } from './webhook-retry.js';
8
8
  export { wireAxInvalidation } from './ax-invalidation.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,KAAK,yBAAyB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,KAAK,yBAAyB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACxI,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -4,6 +4,6 @@ export { KywiValidationError } from './errors.js';
4
4
  export { loadPluginHooks, loadAllPluginHooks, loadAllPlugins, collectPluginContributions, resolvePluginModule, resolvePluginScopeExtensions, pluginKeyOf, pluginRuntimeConfig, } from './plugin-loader.js';
5
5
  export { createPluginActivationRegistry } from './plugin-activation.js';
6
6
  export { createApiResponseHookDispatcher, emitLifecycleHook } from './dispatch.js';
7
- export { createWebhookRetryWorker } from './webhook-retry.js';
7
+ export { createWebhookRetryWorker, startWebhookRetryWorker } from './webhook-retry.js';
8
8
  export { wireAxInvalidation } from './ax-invalidation.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAuC,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,GAUpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAiC,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAuD,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAA2B,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAuC,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,GAUpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAiC,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAuD,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAoD,MAAM,oBAAoB,CAAA;AACxI,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -3,7 +3,7 @@ interface WebhookDelivery {
3
3
  id: string;
4
4
  endpointId: string;
5
5
  event: string;
6
- payload: Record<string, unknown>;
6
+ payload: unknown;
7
7
  status: string;
8
8
  attempts: number;
9
9
  nextRetryAt: Date | null;
@@ -22,5 +22,26 @@ export interface WebhookRetryWorker {
22
22
  tick(): Promise<void>;
23
23
  }
24
24
  export declare function createWebhookRetryWorker(db: KywiDb, deps: RetryDeps): WebhookRetryWorker;
25
+ export interface WebhookRetryHandle {
26
+ /** Stop the interval runner. */
27
+ stop(): void;
28
+ }
29
+ /**
30
+ * Start an in-process interval runner that re-dispatches due webhook retries
31
+ * every `intervalSeconds`, wiring the real DB deps (`listPendingRetries` /
32
+ * `getEndpointById`) into {@link createWebhookRetryWorker}. Mirrors
33
+ * `startScheduler`: overlapping ticks are skipped (a slow sweep never piles up),
34
+ * the timer is `unref()`d so it never keeps the process alive on its own, and
35
+ * one failed sweep routes to `onError` instead of crashing the host. Returns a
36
+ * handle whose `stop()` clears the interval.
37
+ *
38
+ * This is the missing runtime call site for the retry model (#57): before this,
39
+ * `createWebhookRetryWorker` was dead code and failed deliveries never retried.
40
+ */
41
+ export declare function startWebhookRetryWorker(db: KywiDb, opts: {
42
+ intervalSeconds: number;
43
+ onError?: (err: unknown) => void;
44
+ maxAttempts?: number;
45
+ }): WebhookRetryHandle;
25
46
  export {};
26
47
  //# sourceMappingURL=webhook-retry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-retry.d.ts","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,SAAS;IACjB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9D,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;CAC7E;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AASD,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,SAAS,GACd,kBAAkB,CAwBpB"}
1
+ {"version":3,"file":"webhook-retry.d.ts","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IAEb,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,SAAS;IACjB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9D,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;CAC7E;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AASD,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,SAAS,GACd,kBAAkB,CAwBpB;AAED,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,IAAI,IAAI,IAAI,CAAA;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF,kBAAkB,CA0BpB"}
@@ -1,5 +1,5 @@
1
1
  import { createHmac } from 'node:crypto';
2
- import { updateDeliveryStatus } from '../db/webhook-queries.js';
2
+ import { updateDeliveryStatus, listPendingRetries, getEndpointById } from '../db/webhook-queries.js';
3
3
  // Exponential backoff: 1min, 5min, 15min, 60min, ...
4
4
  function computeNextRetryDelay(attempts) {
5
5
  const base = 60_000; // 1 minute
@@ -22,6 +22,43 @@ export function createWebhookRetryWorker(db, deps) {
22
22
  },
23
23
  };
24
24
  }
25
+ /**
26
+ * Start an in-process interval runner that re-dispatches due webhook retries
27
+ * every `intervalSeconds`, wiring the real DB deps (`listPendingRetries` /
28
+ * `getEndpointById`) into {@link createWebhookRetryWorker}. Mirrors
29
+ * `startScheduler`: overlapping ticks are skipped (a slow sweep never piles up),
30
+ * the timer is `unref()`d so it never keeps the process alive on its own, and
31
+ * one failed sweep routes to `onError` instead of crashing the host. Returns a
32
+ * handle whose `stop()` clears the interval.
33
+ *
34
+ * This is the missing runtime call site for the retry model (#57): before this,
35
+ * `createWebhookRetryWorker` was dead code and failed deliveries never retried.
36
+ */
37
+ export function startWebhookRetryWorker(db, opts) {
38
+ const worker = createWebhookRetryWorker(db, {
39
+ listPendingRetries: (d) => listPendingRetries(d, opts.maxAttempts !== undefined ? { maxAttempts: opts.maxAttempts } : {}),
40
+ getEndpointById: (d, id) => getEndpointById(d, id),
41
+ });
42
+ const ms = Math.max(1, opts.intervalSeconds) * 1000;
43
+ const onError = opts.onError ?? ((err) => console.warn('[kywi:webhooks] retry sweep failed:', err));
44
+ let running = false;
45
+ const timer = setInterval(() => {
46
+ if (running)
47
+ return;
48
+ running = true;
49
+ void worker.tick()
50
+ .catch(onError)
51
+ .finally(() => {
52
+ running = false;
53
+ });
54
+ }, ms);
55
+ // Do not hold the event loop open for the retry worker alone.
56
+ if (typeof timer.unref === 'function') {
57
+ ;
58
+ timer.unref();
59
+ }
60
+ return { stop: () => clearInterval(timer) };
61
+ }
25
62
  async function retryDeliver(url, secret, event, payload, deliveryId, previousAttempts, db) {
26
63
  const body = JSON.stringify({ event, data: payload, timestamp: Date.now() });
27
64
  const signature = createHmac('sha256', secret).update(body).digest('hex');
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-retry.js","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AA4B/D,qDAAqD;AACrD,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAA,CAAC,WAAW;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACpC,OAAO,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,EAAU,EACV,IAAe;IAEf,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;YACjD,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;gBACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBAAE,SAAQ;gBAE7C,qCAAqC;gBACrC,YAAY,CACV,QAAQ,CAAC,GAAG,EACZ,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,QAAQ,EACjB,EAAE,CACH,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBAEjB,uDAAuD;gBACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,MAAc,EACd,KAAa,EACb,OAAgB,EAChB,UAAkB,EAClB,gBAAwB,EACxB,EAAU;IAEV,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC5E,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzE,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,CAAA;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,SAAS;gBAC7B,cAAc,EAAE,KAAK;aACtB;YACD,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAA;QAEF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;gBACzC,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;gBACzC,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;aACvE,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;YACzC,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;SACvE,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"webhook-retry.js","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AA6BpG,qDAAqD;AACrD,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAA,CAAC,WAAW;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACpC,OAAO,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,EAAU,EACV,IAAe;IAEf,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;YACjD,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;gBACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBAAE,SAAQ;gBAE7C,qCAAqC;gBACrC,YAAY,CACV,QAAQ,CAAC,GAAG,EACZ,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,QAAQ,EACjB,EAAE,CACH,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBAEjB,uDAAuD;gBACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAOD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,EAAU,EACV,IAAyF;IAEzF,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,EAAE;QAC1C,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CACxB,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC;KACnD,CAAC,CAAA;IACF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAA;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5G,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAM;QACnB,OAAO,GAAG,IAAI,CAAA;QACd,KAAK,MAAM,CAAC,IAAI,EAAE;aACf,KAAK,CAAC,OAAO,CAAC;aACd,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,8DAA8D;IAC9D,IAAI,OAAQ,KAAgC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAClE,CAAC;QAAC,KAA+B,CAAC,KAAK,EAAE,CAAA;IAC3C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAA;AAC7C,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,MAAc,EACd,KAAa,EACb,OAAgB,EAChB,UAAkB,EAClB,gBAAwB,EACxB,EAAU;IAEV,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC5E,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzE,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,CAAA;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,SAAS;gBAC7B,cAAc,EAAE,KAAK;aACtB;YACD,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAA;QAEF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;gBACzC,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;gBACzC,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;aACvE,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE;YACzC,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;SACvE,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { assertProductionAuthSecret, isDevFallbackSecret, DEV_FALLBACK_SECRETS, } from '../auth/auth-secret.js';
2
+ export { canAccessContent, hasMinRole, type ContentAction, type KywiRole, } from '../auth/roles.js';
2
3
  /** httpOnly cookie holding the short-lived access JWT (type=access). */
3
4
  export declare const ACCESS_COOKIE = "kywi_access_token";
4
5
  /** httpOnly cookie holding the long-lived refresh JWT (type=refresh). */
@@ -31,6 +32,33 @@ export type AccessTokenStatus =
31
32
  * because it expired is still refreshable ('stale'); anything else is 'invalid'.
32
33
  */
33
34
  export declare function classifyAccessToken(token: string | undefined, secret: string): Promise<AccessTokenStatus>;
35
+ /** The non-sensitive claims carried by a signature-verified access token. */
36
+ export interface SessionClaims {
37
+ /** The authenticated user's id (token `sub`). */
38
+ sub: string;
39
+ /** The user's role — feeds the content-permission gates (see canAccessContent). */
40
+ role: string;
41
+ /** The user's group ids (empty when the token carries none). */
42
+ groups: string[];
43
+ }
44
+ /**
45
+ * Verify an access-token cookie against the host's auth secret and return its
46
+ * non-sensitive claims (sub / role / groups), or null when the token is missing,
47
+ * malformed, the wrong type, or its signature does not match `secret`.
48
+ *
49
+ * A token whose signature verified but has merely EXPIRED still yields its
50
+ * claims: a public (site) route is NOT in the middleware's refresh matcher, so
51
+ * an actively-signed-in admin's short-lived access cookie may have lapsed by the
52
+ * time they open a page with `?kywi-edit=1`. These claims only gate a client-side
53
+ * edit AFFORDANCE (the front-of-site overlay); every real mutation still flows
54
+ * through /api/v1, which the middleware refreshes and which re-checks auth. So
55
+ * surfacing the overlay for a signature-valid-but-stale admin is safe and correct
56
+ * UX. Anything whose signature does not verify returns null.
57
+ *
58
+ * Intended for a host's public render to decide whether to mount the overlay for
59
+ * the current visitor — pair it with the re-exported `canAccessContent`.
60
+ */
61
+ export declare function readSessionClaims(token: string | undefined, secret: string): Promise<SessionClaims | null>;
34
62
  /**
35
63
  * Pull the access/refresh tokens out of a token-issuing endpoint's JSON body
36
64
  * (`{ data: { accessToken, refreshToken } }`). Missing/non-string fields and
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAE/B,wEAAwE;AACxE,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAChD,yEAAyE;AACzE,eAAO,MAAM,cAAc,uBAAuB,CAAA;AAGlD,eAAO,MAAM,kBAAkB,QAAU,CAAA;AACzC,eAAO,MAAM,mBAAmB,QAAmB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAMlD,CAAA;AAEF,MAAM,MAAM,iBAAiB;AAC3B,wEAAwE;AACtE,OAAO;AACT,2EAA2E;GACzE,OAAO;AACT,yEAAyE;GACvE,SAAS,CAAA;AAcb;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAUA;AAED;oCACoC;AACpC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAA;KAAE,CAAA;CACvF;AAkBD,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,SAAqB,GAAG,oBAAoB,CAErF;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,MAAM,SAAsB,GAAG,oBAAoB,CAEvF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAG7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAM/B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAA;AAEzB,wEAAwE;AACxE,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAChD,yEAAyE;AACzE,eAAO,MAAM,cAAc,uBAAuB,CAAA;AAGlD,eAAO,MAAM,kBAAkB,QAAU,CAAA;AACzC,eAAO,MAAM,mBAAmB,QAAmB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAMlD,CAAA;AAEF,MAAM,MAAM,iBAAiB;AAC3B,wEAAwE;AACtE,OAAO;AACT,2EAA2E;GACzE,OAAO;AACT,yEAAyE;GACvE,SAAS,CAAA;AAcb;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAA;IACX,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiB/B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAUA;AAED;oCACoC;AACpC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAA;KAAE,CAAA;CACvF;AAkBD,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,SAAqB,GAAG,oBAAoB,CAErF;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,MAAM,SAAsB,GAAG,oBAAoB,CAEvF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAG7D"}
@@ -22,12 +22,17 @@
22
22
  * them. The security-critical crypto (JWT verify, token classification, cookie
23
23
  * options) lives here once; the two host files carry only framework wiring.
24
24
  */
25
- import { jwtVerify } from 'jose';
25
+ import { jwtVerify, decodeJwt } from 'jose';
26
26
  // Re-export the AUTH_SECRET production guard so a generated app can call it at
27
27
  // module scope (in middleware.ts / kywi.config.ts) and refuse to build/start in
28
28
  // production with a missing or dev-fallback secret. Shares its policy with the
29
29
  // CLI/app env-guard, so both agree on what an insecure secret is.
30
30
  export { assertProductionAuthSecret, isDevFallbackSecret, DEV_FALLBACK_SECRETS, } from '../auth/auth-secret.js';
31
+ // Re-export the pure role → content-permission helpers so a host's public (site)
32
+ // render can decide, from a verified token's role, whether to surface the
33
+ // front-of-site edit overlay (see readSessionClaims). Both are dependency-free,
34
+ // so this adds nothing to the edge bundle beyond the constants they close over.
35
+ export { canAccessContent, hasMinRole, } from '../auth/roles.js';
31
36
  /** httpOnly cookie holding the short-lived access JWT (type=access). */
32
37
  export const ACCESS_COOKIE = 'kywi_access_token';
33
38
  /** httpOnly cookie holding the long-lived refresh JWT (type=refresh). */
@@ -88,6 +93,56 @@ export async function classifyAccessToken(token, secret) {
88
93
  return 'invalid';
89
94
  }
90
95
  }
96
+ function claimsFromPayload(payload) {
97
+ if (payload['type'] !== 'access')
98
+ return null;
99
+ const sub = typeof payload['sub'] === 'string' ? payload['sub'] : null;
100
+ const role = typeof payload['role'] === 'string' ? payload['role'] : null;
101
+ if (!sub || !role)
102
+ return null;
103
+ const groups = Array.isArray(payload['groups'])
104
+ ? payload['groups'].filter((g) => typeof g === 'string')
105
+ : [];
106
+ return { sub, role, groups };
107
+ }
108
+ /**
109
+ * Verify an access-token cookie against the host's auth secret and return its
110
+ * non-sensitive claims (sub / role / groups), or null when the token is missing,
111
+ * malformed, the wrong type, or its signature does not match `secret`.
112
+ *
113
+ * A token whose signature verified but has merely EXPIRED still yields its
114
+ * claims: a public (site) route is NOT in the middleware's refresh matcher, so
115
+ * an actively-signed-in admin's short-lived access cookie may have lapsed by the
116
+ * time they open a page with `?kywi-edit=1`. These claims only gate a client-side
117
+ * edit AFFORDANCE (the front-of-site overlay); every real mutation still flows
118
+ * through /api/v1, which the middleware refreshes and which re-checks auth. So
119
+ * surfacing the overlay for a signature-valid-but-stale admin is safe and correct
120
+ * UX. Anything whose signature does not verify returns null.
121
+ *
122
+ * Intended for a host's public render to decide whether to mount the overlay for
123
+ * the current visitor — pair it with the re-exported `canAccessContent`.
124
+ */
125
+ export async function readSessionClaims(token, secret) {
126
+ if (!token)
127
+ return null;
128
+ try {
129
+ const { payload } = await jwtVerify(token, keyFor(secret), { algorithms: ['HS256'] });
130
+ return claimsFromPayload(payload);
131
+ }
132
+ catch (err) {
133
+ // jose verifies the signature BEFORE the exp claim, so ERR_JWT_EXPIRED means
134
+ // the signature was valid — decode the (unverified) claims to read the role.
135
+ if (err.code === 'ERR_JWT_EXPIRED') {
136
+ try {
137
+ return claimsFromPayload(decodeJwt(token));
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ return null;
144
+ }
145
+ }
91
146
  /**
92
147
  * Pull the access/refresh tokens out of a token-issuing endpoint's JSON body
93
148
  * (`{ data: { accessToken, refreshToken } }`). Missing/non-string fields and
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Comments layout module (#29). Renders the approved-comment list for the
3
+ * current content plus a public submission form. New comments POST to the
4
+ * collection endpoint `POST /api/v1/comments` and always land in the moderation
5
+ * queue as `pending`; they only appear here once an editor approves them (the
6
+ * list reads `GET /api/v1/comments?contentId=…&status=approved`, which the API
7
+ * only ever returns approved rows for).
8
+ *
9
+ * Inside the layout-editor canvas it renders a non-interactive preview (no live
10
+ * `<form>`), matching the Form module's editor behaviour (kywi-cms#36).
11
+ */
12
+ interface ModuleProps {
13
+ props: Record<string, unknown>;
14
+ style?: Record<string, string>;
15
+ }
16
+ export declare function CommentsModule({ props }: ModuleProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=comments-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-module.d.ts","sourceRoot":"","sources":["../../src/layout/comments-module.tsx"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AAEH,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AA2OD,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CAmBpD"}