@krantho/api 0.0.0-stage → 1.0.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 (675) hide show
  1. package/LICENSE +21 -0
  2. package/dist/active-locales.d.ts +11 -0
  3. package/dist/active-locales.d.ts.map +1 -0
  4. package/dist/active-locales.js +31 -0
  5. package/dist/active-locales.js.map +1 -0
  6. package/dist/assistant/access.d.ts +25 -0
  7. package/dist/assistant/access.d.ts.map +1 -0
  8. package/dist/assistant/access.js +35 -0
  9. package/dist/assistant/access.js.map +1 -0
  10. package/dist/assistant/agent-loop.d.ts +31 -0
  11. package/dist/assistant/agent-loop.d.ts.map +1 -0
  12. package/dist/assistant/agent-loop.js +183 -0
  13. package/dist/assistant/agent-loop.js.map +1 -0
  14. package/dist/assistant/call-handler.d.ts +15 -0
  15. package/dist/assistant/call-handler.d.ts.map +1 -0
  16. package/dist/assistant/call-handler.js +24 -0
  17. package/dist/assistant/call-handler.js.map +1 -0
  18. package/dist/assistant/chat-handler.d.ts +8 -0
  19. package/dist/assistant/chat-handler.d.ts.map +1 -0
  20. package/dist/assistant/chat-handler.js +79 -0
  21. package/dist/assistant/chat-handler.js.map +1 -0
  22. package/dist/assistant/chat-request.d.ts +16 -0
  23. package/dist/assistant/chat-request.d.ts.map +1 -0
  24. package/dist/assistant/chat-request.js +59 -0
  25. package/dist/assistant/chat-request.js.map +1 -0
  26. package/dist/assistant/confirm-handler.d.ts +3 -0
  27. package/dist/assistant/confirm-handler.d.ts.map +1 -0
  28. package/dist/assistant/confirm-handler.js +39 -0
  29. package/dist/assistant/confirm-handler.js.map +1 -0
  30. package/dist/assistant/document-change.d.ts +22 -0
  31. package/dist/assistant/document-change.d.ts.map +1 -0
  32. package/dist/assistant/document-change.js +74 -0
  33. package/dist/assistant/document-change.js.map +1 -0
  34. package/dist/assistant/document-lock.d.ts +12 -0
  35. package/dist/assistant/document-lock.d.ts.map +1 -0
  36. package/dist/assistant/document-lock.js +14 -0
  37. package/dist/assistant/document-lock.js.map +1 -0
  38. package/dist/assistant/execute-action.d.ts +19 -0
  39. package/dist/assistant/execute-action.d.ts.map +1 -0
  40. package/dist/assistant/execute-action.js +167 -0
  41. package/dist/assistant/execute-action.js.map +1 -0
  42. package/dist/assistant/pending-action.d.ts +86 -0
  43. package/dist/assistant/pending-action.d.ts.map +1 -0
  44. package/dist/assistant/pending-action.js +104 -0
  45. package/dist/assistant/pending-action.js.map +1 -0
  46. package/dist/assistant/protocol.d.ts +120 -0
  47. package/dist/assistant/protocol.d.ts.map +1 -0
  48. package/dist/assistant/protocol.js +2 -0
  49. package/dist/assistant/protocol.js.map +1 -0
  50. package/dist/assistant/routes.d.ts +4 -0
  51. package/dist/assistant/routes.d.ts.map +1 -0
  52. package/dist/assistant/routes.js +10 -0
  53. package/dist/assistant/routes.js.map +1 -0
  54. package/dist/assistant/sse-stream.d.ts +15 -0
  55. package/dist/assistant/sse-stream.d.ts.map +1 -0
  56. package/dist/assistant/sse-stream.js +61 -0
  57. package/dist/assistant/sse-stream.js.map +1 -0
  58. package/dist/assistant/status-handler.d.ts +8 -0
  59. package/dist/assistant/status-handler.d.ts.map +1 -0
  60. package/dist/assistant/status-handler.js +39 -0
  61. package/dist/assistant/status-handler.js.map +1 -0
  62. package/dist/assistant/system-prompt.d.ts +18 -0
  63. package/dist/assistant/system-prompt.d.ts.map +1 -0
  64. package/dist/assistant/system-prompt.js +48 -0
  65. package/dist/assistant/system-prompt.js.map +1 -0
  66. package/dist/assistant/tool-registry.d.ts +19 -0
  67. package/dist/assistant/tool-registry.d.ts.map +1 -0
  68. package/dist/assistant/tool-registry.js +69 -0
  69. package/dist/assistant/tool-registry.js.map +1 -0
  70. package/dist/assistant/tools/action-tools.d.ts +4 -0
  71. package/dist/assistant/tools/action-tools.d.ts.map +1 -0
  72. package/dist/assistant/tools/action-tools.js +132 -0
  73. package/dist/assistant/tools/action-tools.js.map +1 -0
  74. package/dist/assistant/tools/aeo-tools.d.ts +4 -0
  75. package/dist/assistant/tools/aeo-tools.d.ts.map +1 -0
  76. package/dist/assistant/tools/aeo-tools.js +162 -0
  77. package/dist/assistant/tools/aeo-tools.js.map +1 -0
  78. package/dist/assistant/tools/define-tool.d.ts +55 -0
  79. package/dist/assistant/tools/define-tool.d.ts.map +1 -0
  80. package/dist/assistant/tools/define-tool.js +5 -0
  81. package/dist/assistant/tools/define-tool.js.map +1 -0
  82. package/dist/assistant/tools/draft-tools.d.ts +7 -0
  83. package/dist/assistant/tools/draft-tools.d.ts.map +1 -0
  84. package/dist/assistant/tools/draft-tools.js +105 -0
  85. package/dist/assistant/tools/draft-tools.js.map +1 -0
  86. package/dist/assistant/tools/draft-write.d.ts +49 -0
  87. package/dist/assistant/tools/draft-write.d.ts.map +1 -0
  88. package/dist/assistant/tools/draft-write.js +122 -0
  89. package/dist/assistant/tools/draft-write.js.map +1 -0
  90. package/dist/assistant/tools/faq-fit.d.ts +32 -0
  91. package/dist/assistant/tools/faq-fit.d.ts.map +1 -0
  92. package/dist/assistant/tools/faq-fit.js +96 -0
  93. package/dist/assistant/tools/faq-fit.js.map +1 -0
  94. package/dist/assistant/tools/read-tools.d.ts +13 -0
  95. package/dist/assistant/tools/read-tools.d.ts.map +1 -0
  96. package/dist/assistant/tools/read-tools.js +242 -0
  97. package/dist/assistant/tools/read-tools.js.map +1 -0
  98. package/dist/assistant/tools/seo-tools.d.ts +4 -0
  99. package/dist/assistant/tools/seo-tools.d.ts.map +1 -0
  100. package/dist/assistant/tools/seo-tools.js +152 -0
  101. package/dist/assistant/tools/seo-tools.js.map +1 -0
  102. package/dist/assistant/tools/support.d.ts +35 -0
  103. package/dist/assistant/tools/support.d.ts.map +1 -0
  104. package/dist/assistant/tools/support.js +63 -0
  105. package/dist/assistant/tools/support.js.map +1 -0
  106. package/dist/assistant/untrusted.d.ts +15 -0
  107. package/dist/assistant/untrusted.d.ts.map +1 -0
  108. package/dist/assistant/untrusted.js +27 -0
  109. package/dist/assistant/untrusted.js.map +1 -0
  110. package/dist/assistant/write-policy.d.ts +20 -0
  111. package/dist/assistant/write-policy.d.ts.map +1 -0
  112. package/dist/assistant/write-policy.js +32 -0
  113. package/dist/assistant/write-policy.js.map +1 -0
  114. package/dist/auth-tokens.d.ts +31 -0
  115. package/dist/auth-tokens.d.ts.map +1 -0
  116. package/dist/auth-tokens.js +35 -0
  117. package/dist/auth-tokens.js.map +1 -0
  118. package/dist/content-change.d.ts +16 -0
  119. package/dist/content-change.d.ts.map +1 -0
  120. package/dist/content-change.js +34 -0
  121. package/dist/content-change.js.map +1 -0
  122. package/dist/content-locks.d.ts +27 -0
  123. package/dist/content-locks.d.ts.map +1 -0
  124. package/dist/content-locks.js +40 -0
  125. package/dist/content-locks.js.map +1 -0
  126. package/dist/cookies.d.ts +19 -0
  127. package/dist/cookies.d.ts.map +1 -0
  128. package/dist/cookies.js +52 -0
  129. package/dist/cookies.js.map +1 -0
  130. package/dist/create-api-handlers.d.ts +128 -0
  131. package/dist/create-api-handlers.d.ts.map +1 -0
  132. package/dist/create-api-handlers.js +384 -0
  133. package/dist/create-api-handlers.js.map +1 -0
  134. package/dist/document-actions.d.ts +25 -0
  135. package/dist/document-actions.d.ts.map +1 -0
  136. package/dist/document-actions.js +157 -0
  137. package/dist/document-actions.js.map +1 -0
  138. package/dist/document-seo.d.ts +15 -0
  139. package/dist/document-seo.d.ts.map +1 -0
  140. package/dist/document-seo.js +41 -0
  141. package/dist/document-seo.js.map +1 -0
  142. package/dist/group-by-collection.d.ts +6 -0
  143. package/dist/group-by-collection.d.ts.map +1 -0
  144. package/dist/group-by-collection.js +11 -0
  145. package/dist/group-by-collection.js.map +1 -0
  146. package/dist/handlers/apply-metadata-defaults.d.ts +4 -0
  147. package/dist/handlers/apply-metadata-defaults.d.ts.map +1 -0
  148. package/dist/handlers/apply-metadata-defaults.js +108 -0
  149. package/dist/handlers/apply-metadata-defaults.js.map +1 -0
  150. package/dist/handlers/auth-callback.d.ts +4 -0
  151. package/dist/handlers/auth-callback.d.ts.map +1 -0
  152. package/dist/handlers/auth-callback.js +217 -0
  153. package/dist/handlers/auth-callback.js.map +1 -0
  154. package/dist/handlers/auth-capabilities.d.ts +4 -0
  155. package/dist/handlers/auth-capabilities.d.ts.map +1 -0
  156. package/dist/handlers/auth-capabilities.js +19 -0
  157. package/dist/handlers/auth-capabilities.js.map +1 -0
  158. package/dist/handlers/auth-login.d.ts +4 -0
  159. package/dist/handlers/auth-login.d.ts.map +1 -0
  160. package/dist/handlers/auth-login.js +60 -0
  161. package/dist/handlers/auth-login.js.map +1 -0
  162. package/dist/handlers/auth-logout.d.ts +4 -0
  163. package/dist/handlers/auth-logout.d.ts.map +1 -0
  164. package/dist/handlers/auth-logout.js +40 -0
  165. package/dist/handlers/auth-logout.js.map +1 -0
  166. package/dist/handlers/auth-me.d.ts +4 -0
  167. package/dist/handlers/auth-me.d.ts.map +1 -0
  168. package/dist/handlers/auth-me.js +54 -0
  169. package/dist/handlers/auth-me.js.map +1 -0
  170. package/dist/handlers/auth-oidc-login.d.ts +4 -0
  171. package/dist/handlers/auth-oidc-login.d.ts.map +1 -0
  172. package/dist/handlers/auth-oidc-login.js +51 -0
  173. package/dist/handlers/auth-oidc-login.js.map +1 -0
  174. package/dist/handlers/auth-refresh.d.ts +15 -0
  175. package/dist/handlers/auth-refresh.d.ts.map +1 -0
  176. package/dist/handlers/auth-refresh.js +82 -0
  177. package/dist/handlers/auth-refresh.js.map +1 -0
  178. package/dist/handlers/bulk-delete.d.ts +8 -0
  179. package/dist/handlers/bulk-delete.d.ts.map +1 -0
  180. package/dist/handlers/bulk-delete.js +72 -0
  181. package/dist/handlers/bulk-delete.js.map +1 -0
  182. package/dist/handlers/bulk-publish.d.ts +8 -0
  183. package/dist/handlers/bulk-publish.d.ts.map +1 -0
  184. package/dist/handlers/bulk-publish.js +48 -0
  185. package/dist/handlers/bulk-publish.js.map +1 -0
  186. package/dist/handlers/capabilities.d.ts +4 -0
  187. package/dist/handlers/capabilities.d.ts.map +1 -0
  188. package/dist/handlers/capabilities.js +44 -0
  189. package/dist/handlers/capabilities.js.map +1 -0
  190. package/dist/handlers/content-changes.d.ts +28 -0
  191. package/dist/handlers/content-changes.d.ts.map +1 -0
  192. package/dist/handlers/content-changes.js +160 -0
  193. package/dist/handlers/content-changes.js.map +1 -0
  194. package/dist/handlers/content-lock.d.ts +13 -0
  195. package/dist/handlers/content-lock.d.ts.map +1 -0
  196. package/dist/handlers/content-lock.js +109 -0
  197. package/dist/handlers/content-lock.js.map +1 -0
  198. package/dist/handlers/content-tree.d.ts +11 -0
  199. package/dist/handlers/content-tree.d.ts.map +1 -0
  200. package/dist/handlers/content-tree.js +28 -0
  201. package/dist/handlers/content-tree.js.map +1 -0
  202. package/dist/handlers/create-content.d.ts +4 -0
  203. package/dist/handlers/create-content.d.ts.map +1 -0
  204. package/dist/handlers/create-content.js +49 -0
  205. package/dist/handlers/create-content.js.map +1 -0
  206. package/dist/handlers/delete-content.d.ts +4 -0
  207. package/dist/handlers/delete-content.d.ts.map +1 -0
  208. package/dist/handlers/delete-content.js +17 -0
  209. package/dist/handlers/delete-content.js.map +1 -0
  210. package/dist/handlers/delete-runtime-field.d.ts +4 -0
  211. package/dist/handlers/delete-runtime-field.d.ts.map +1 -0
  212. package/dist/handlers/delete-runtime-field.js +43 -0
  213. package/dist/handlers/delete-runtime-field.js.map +1 -0
  214. package/dist/handlers/export-bundle.d.ts +13 -0
  215. package/dist/handlers/export-bundle.d.ts.map +1 -0
  216. package/dist/handlers/export-bundle.js +99 -0
  217. package/dist/handlers/export-bundle.js.map +1 -0
  218. package/dist/handlers/export-content.d.ts +7 -0
  219. package/dist/handlers/export-content.d.ts.map +1 -0
  220. package/dist/handlers/export-content.js +69 -0
  221. package/dist/handlers/export-content.js.map +1 -0
  222. package/dist/handlers/export-schema.d.ts +4 -0
  223. package/dist/handlers/export-schema.d.ts.map +1 -0
  224. package/dist/handlers/export-schema.js +13 -0
  225. package/dist/handlers/export-schema.js.map +1 -0
  226. package/dist/handlers/get-content.d.ts +4 -0
  227. package/dist/handlers/get-content.d.ts.map +1 -0
  228. package/dist/handlers/get-content.js +65 -0
  229. package/dist/handlers/get-content.js.map +1 -0
  230. package/dist/handlers/get-runtime-schema.d.ts +4 -0
  231. package/dist/handlers/get-runtime-schema.d.ts.map +1 -0
  232. package/dist/handlers/get-runtime-schema.js +17 -0
  233. package/dist/handlers/get-runtime-schema.js.map +1 -0
  234. package/dist/handlers/get-schema.d.ts +4 -0
  235. package/dist/handlers/get-schema.d.ts.map +1 -0
  236. package/dist/handlers/get-schema.js +87 -0
  237. package/dist/handlers/get-schema.js.map +1 -0
  238. package/dist/handlers/get-version.d.ts +4 -0
  239. package/dist/handlers/get-version.d.ts.map +1 -0
  240. package/dist/handlers/get-version.js +26 -0
  241. package/dist/handlers/get-version.js.map +1 -0
  242. package/dist/handlers/import-bundle.d.ts +4 -0
  243. package/dist/handlers/import-bundle.d.ts.map +1 -0
  244. package/dist/handlers/import-bundle.js +55 -0
  245. package/dist/handlers/import-bundle.js.map +1 -0
  246. package/dist/handlers/import-content.d.ts +4 -0
  247. package/dist/handlers/import-content.d.ts.map +1 -0
  248. package/dist/handlers/import-content.js +152 -0
  249. package/dist/handlers/import-content.js.map +1 -0
  250. package/dist/handlers/index.d.ts +87 -0
  251. package/dist/handlers/index.d.ts.map +1 -0
  252. package/dist/handlers/index.js +87 -0
  253. package/dist/handlers/index.js.map +1 -0
  254. package/dist/handlers/list-collection.d.ts +8 -0
  255. package/dist/handlers/list-collection.d.ts.map +1 -0
  256. package/dist/handlers/list-collection.js +14 -0
  257. package/dist/handlers/list-collection.js.map +1 -0
  258. package/dist/handlers/list-collections.d.ts +4 -0
  259. package/dist/handlers/list-collections.d.ts.map +1 -0
  260. package/dist/handlers/list-collections.js +17 -0
  261. package/dist/handlers/list-collections.js.map +1 -0
  262. package/dist/handlers/list-content.d.ts +8 -0
  263. package/dist/handlers/list-content.d.ts.map +1 -0
  264. package/dist/handlers/list-content.js +22 -0
  265. package/dist/handlers/list-content.js.map +1 -0
  266. package/dist/handlers/list-query.d.ts +7 -0
  267. package/dist/handlers/list-query.d.ts.map +1 -0
  268. package/dist/handlers/list-query.js +36 -0
  269. package/dist/handlers/list-query.js.map +1 -0
  270. package/dist/handlers/list-versions.d.ts +4 -0
  271. package/dist/handlers/list-versions.d.ts.map +1 -0
  272. package/dist/handlers/list-versions.js +19 -0
  273. package/dist/handlers/list-versions.js.map +1 -0
  274. package/dist/handlers/llm-credential.d.ts +46 -0
  275. package/dist/handlers/llm-credential.d.ts.map +1 -0
  276. package/dist/handlers/llm-credential.js +68 -0
  277. package/dist/handlers/llm-credential.js.map +1 -0
  278. package/dist/handlers/llm-resolve.d.ts +45 -0
  279. package/dist/handlers/llm-resolve.d.ts.map +1 -0
  280. package/dist/handlers/llm-resolve.js +126 -0
  281. package/dist/handlers/llm-resolve.js.map +1 -0
  282. package/dist/handlers/llm-settings.d.ts +19 -0
  283. package/dist/handlers/llm-settings.d.ts.map +1 -0
  284. package/dist/handlers/llm-settings.js +209 -0
  285. package/dist/handlers/llm-settings.js.map +1 -0
  286. package/dist/handlers/media-bulk-delete.d.ts +4 -0
  287. package/dist/handlers/media-bulk-delete.d.ts.map +1 -0
  288. package/dist/handlers/media-bulk-delete.js +19 -0
  289. package/dist/handlers/media-bulk-delete.js.map +1 -0
  290. package/dist/handlers/media-bulk-update.d.ts +4 -0
  291. package/dist/handlers/media-bulk-update.d.ts.map +1 -0
  292. package/dist/handlers/media-bulk-update.js +25 -0
  293. package/dist/handlers/media-bulk-update.js.map +1 -0
  294. package/dist/handlers/media-delete.d.ts +4 -0
  295. package/dist/handlers/media-delete.d.ts.map +1 -0
  296. package/dist/handlers/media-delete.js +27 -0
  297. package/dist/handlers/media-delete.js.map +1 -0
  298. package/dist/handlers/media-duplicate.d.ts +4 -0
  299. package/dist/handlers/media-duplicate.d.ts.map +1 -0
  300. package/dist/handlers/media-duplicate.js +20 -0
  301. package/dist/handlers/media-duplicate.js.map +1 -0
  302. package/dist/handlers/media-folders.d.ts +12 -0
  303. package/dist/handlers/media-folders.d.ts.map +1 -0
  304. package/dist/handlers/media-folders.js +119 -0
  305. package/dist/handlers/media-folders.js.map +1 -0
  306. package/dist/handlers/media-get.d.ts +4 -0
  307. package/dist/handlers/media-get.d.ts.map +1 -0
  308. package/dist/handlers/media-get.js +16 -0
  309. package/dist/handlers/media-get.js.map +1 -0
  310. package/dist/handlers/media-image-info.d.ts +4 -0
  311. package/dist/handlers/media-image-info.d.ts.map +1 -0
  312. package/dist/handlers/media-image-info.js +32 -0
  313. package/dist/handlers/media-image-info.js.map +1 -0
  314. package/dist/handlers/media-image.d.ts +11 -0
  315. package/dist/handlers/media-image.d.ts.map +1 -0
  316. package/dist/handlers/media-image.js +116 -0
  317. package/dist/handlers/media-image.js.map +1 -0
  318. package/dist/handlers/media-info.d.ts +4 -0
  319. package/dist/handlers/media-info.d.ts.map +1 -0
  320. package/dist/handlers/media-info.js +18 -0
  321. package/dist/handlers/media-info.js.map +1 -0
  322. package/dist/handlers/media-list.d.ts +4 -0
  323. package/dist/handlers/media-list.d.ts.map +1 -0
  324. package/dist/handlers/media-list.js +14 -0
  325. package/dist/handlers/media-list.js.map +1 -0
  326. package/dist/handlers/media-register.d.ts +4 -0
  327. package/dist/handlers/media-register.d.ts.map +1 -0
  328. package/dist/handlers/media-register.js +57 -0
  329. package/dist/handlers/media-register.js.map +1 -0
  330. package/dist/handlers/media-replace.d.ts +9 -0
  331. package/dist/handlers/media-replace.d.ts.map +1 -0
  332. package/dist/handlers/media-replace.js +53 -0
  333. package/dist/handlers/media-replace.js.map +1 -0
  334. package/dist/handlers/media-tags.d.ts +4 -0
  335. package/dist/handlers/media-tags.d.ts.map +1 -0
  336. package/dist/handlers/media-tags.js +9 -0
  337. package/dist/handlers/media-tags.js.map +1 -0
  338. package/dist/handlers/media-update.d.ts +4 -0
  339. package/dist/handlers/media-update.d.ts.map +1 -0
  340. package/dist/handlers/media-update.js +64 -0
  341. package/dist/handlers/media-update.js.map +1 -0
  342. package/dist/handlers/media-upload.d.ts +4 -0
  343. package/dist/handlers/media-upload.d.ts.map +1 -0
  344. package/dist/handlers/media-upload.js +26 -0
  345. package/dist/handlers/media-upload.js.map +1 -0
  346. package/dist/handlers/media-usage.d.ts +9 -0
  347. package/dist/handlers/media-usage.d.ts.map +1 -0
  348. package/dist/handlers/media-usage.js +36 -0
  349. package/dist/handlers/media-usage.js.map +1 -0
  350. package/dist/handlers/migration-conflicts.d.ts +13 -0
  351. package/dist/handlers/migration-conflicts.d.ts.map +1 -0
  352. package/dist/handlers/migration-conflicts.js +55 -0
  353. package/dist/handlers/migration-conflicts.js.map +1 -0
  354. package/dist/handlers/migration-status.d.ts +4 -0
  355. package/dist/handlers/migration-status.d.ts.map +1 -0
  356. package/dist/handlers/migration-status.js +34 -0
  357. package/dist/handlers/migration-status.js.map +1 -0
  358. package/dist/handlers/publish-content.d.ts +9 -0
  359. package/dist/handlers/publish-content.d.ts.map +1 -0
  360. package/dist/handlers/publish-content.js +47 -0
  361. package/dist/handlers/publish-content.js.map +1 -0
  362. package/dist/handlers/publish-impact.d.ts +11 -0
  363. package/dist/handlers/publish-impact.d.ts.map +1 -0
  364. package/dist/handlers/publish-impact.js +44 -0
  365. package/dist/handlers/publish-impact.js.map +1 -0
  366. package/dist/handlers/resolve-page.d.ts +9 -0
  367. package/dist/handlers/resolve-page.d.ts.map +1 -0
  368. package/dist/handlers/resolve-page.js +105 -0
  369. package/dist/handlers/resolve-page.js.map +1 -0
  370. package/dist/handlers/restore-version.d.ts +4 -0
  371. package/dist/handlers/restore-version.d.ts.map +1 -0
  372. package/dist/handlers/restore-version.js +69 -0
  373. package/dist/handlers/restore-version.js.map +1 -0
  374. package/dist/handlers/runtime-metadata.d.ts +6 -0
  375. package/dist/handlers/runtime-metadata.d.ts.map +1 -0
  376. package/dist/handlers/runtime-metadata.js +82 -0
  377. package/dist/handlers/runtime-metadata.js.map +1 -0
  378. package/dist/handlers/save-runtime-field.d.ts +4 -0
  379. package/dist/handlers/save-runtime-field.d.ts.map +1 -0
  380. package/dist/handlers/save-runtime-field.js +108 -0
  381. package/dist/handlers/save-runtime-field.js.map +1 -0
  382. package/dist/handlers/search-content.d.ts +9 -0
  383. package/dist/handlers/search-content.d.ts.map +1 -0
  384. package/dist/handlers/search-content.js +40 -0
  385. package/dist/handlers/search-content.js.map +1 -0
  386. package/dist/handlers/seo-config.d.ts +16 -0
  387. package/dist/handlers/seo-config.d.ts.map +1 -0
  388. package/dist/handlers/seo-config.js +250 -0
  389. package/dist/handlers/seo-config.js.map +1 -0
  390. package/dist/handlers/seo-document.d.ts +24 -0
  391. package/dist/handlers/seo-document.d.ts.map +1 -0
  392. package/dist/handlers/seo-document.js +119 -0
  393. package/dist/handlers/seo-document.js.map +1 -0
  394. package/dist/handlers/seo-enrich-archetype.d.ts +71 -0
  395. package/dist/handlers/seo-enrich-archetype.d.ts.map +1 -0
  396. package/dist/handlers/seo-enrich-archetype.js +250 -0
  397. package/dist/handlers/seo-enrich-archetype.js.map +1 -0
  398. package/dist/handlers/seo-enrich-meta.d.ts +40 -0
  399. package/dist/handlers/seo-enrich-meta.d.ts.map +1 -0
  400. package/dist/handlers/seo-enrich-meta.js +121 -0
  401. package/dist/handlers/seo-enrich-meta.js.map +1 -0
  402. package/dist/handlers/seo-enrich-runner.d.ts +65 -0
  403. package/dist/handlers/seo-enrich-runner.d.ts.map +1 -0
  404. package/dist/handlers/seo-enrich-runner.js +192 -0
  405. package/dist/handlers/seo-enrich-runner.js.map +1 -0
  406. package/dist/handlers/seo-enrich.d.ts +10 -0
  407. package/dist/handlers/seo-enrich.d.ts.map +1 -0
  408. package/dist/handlers/seo-enrich.js +166 -0
  409. package/dist/handlers/seo-enrich.js.map +1 -0
  410. package/dist/handlers/seo-generate.d.ts +4 -0
  411. package/dist/handlers/seo-generate.d.ts.map +1 -0
  412. package/dist/handlers/seo-generate.js +31 -0
  413. package/dist/handlers/seo-generate.js.map +1 -0
  414. package/dist/handlers/seo-impact.d.ts +36 -0
  415. package/dist/handlers/seo-impact.d.ts.map +1 -0
  416. package/dist/handlers/seo-impact.js +137 -0
  417. package/dist/handlers/seo-impact.js.map +1 -0
  418. package/dist/handlers/seo-indexnow.d.ts +11 -0
  419. package/dist/handlers/seo-indexnow.d.ts.map +1 -0
  420. package/dist/handlers/seo-indexnow.js +15 -0
  421. package/dist/handlers/seo-indexnow.js.map +1 -0
  422. package/dist/handlers/seo-llms-txt.d.ts +26 -0
  423. package/dist/handlers/seo-llms-txt.d.ts.map +1 -0
  424. package/dist/handlers/seo-llms-txt.js +99 -0
  425. package/dist/handlers/seo-llms-txt.js.map +1 -0
  426. package/dist/handlers/seo-preview.d.ts +8 -0
  427. package/dist/handlers/seo-preview.d.ts.map +1 -0
  428. package/dist/handlers/seo-preview.js +49 -0
  429. package/dist/handlers/seo-preview.js.map +1 -0
  430. package/dist/handlers/seo-robots.d.ts +22 -0
  431. package/dist/handlers/seo-robots.d.ts.map +1 -0
  432. package/dist/handlers/seo-robots.js +48 -0
  433. package/dist/handlers/seo-robots.js.map +1 -0
  434. package/dist/handlers/seo-sitemap.d.ts +68 -0
  435. package/dist/handlers/seo-sitemap.d.ts.map +1 -0
  436. package/dist/handlers/seo-sitemap.js +178 -0
  437. package/dist/handlers/seo-sitemap.js.map +1 -0
  438. package/dist/handlers/seo-status.d.ts +4 -0
  439. package/dist/handlers/seo-status.d.ts.map +1 -0
  440. package/dist/handlers/seo-status.js +61 -0
  441. package/dist/handlers/seo-status.js.map +1 -0
  442. package/dist/handlers/seo-structured-data.d.ts +4 -0
  443. package/dist/handlers/seo-structured-data.d.ts.map +1 -0
  444. package/dist/handlers/seo-structured-data.js +18 -0
  445. package/dist/handlers/seo-structured-data.js.map +1 -0
  446. package/dist/handlers/site-config.d.ts +8 -0
  447. package/dist/handlers/site-config.d.ts.map +1 -0
  448. package/dist/handlers/site-config.js +26 -0
  449. package/dist/handlers/site-config.js.map +1 -0
  450. package/dist/handlers/site-preview.d.ts +10 -0
  451. package/dist/handlers/site-preview.d.ts.map +1 -0
  452. package/dist/handlers/site-preview.js +54 -0
  453. package/dist/handlers/site-preview.js.map +1 -0
  454. package/dist/handlers/site-settings.d.ts +17 -0
  455. package/dist/handlers/site-settings.d.ts.map +1 -0
  456. package/dist/handlers/site-settings.js +75 -0
  457. package/dist/handlers/site-settings.js.map +1 -0
  458. package/dist/handlers/snapshot-create.d.ts +4 -0
  459. package/dist/handlers/snapshot-create.d.ts.map +1 -0
  460. package/dist/handlers/snapshot-create.js +15 -0
  461. package/dist/handlers/snapshot-create.js.map +1 -0
  462. package/dist/handlers/snapshot-delete.d.ts +4 -0
  463. package/dist/handlers/snapshot-delete.d.ts.map +1 -0
  464. package/dist/handlers/snapshot-delete.js +21 -0
  465. package/dist/handlers/snapshot-delete.js.map +1 -0
  466. package/dist/handlers/snapshot-get.d.ts +4 -0
  467. package/dist/handlers/snapshot-get.d.ts.map +1 -0
  468. package/dist/handlers/snapshot-get.js +17 -0
  469. package/dist/handlers/snapshot-get.js.map +1 -0
  470. package/dist/handlers/snapshot-list.d.ts +4 -0
  471. package/dist/handlers/snapshot-list.d.ts.map +1 -0
  472. package/dist/handlers/snapshot-list.js +9 -0
  473. package/dist/handlers/snapshot-list.js.map +1 -0
  474. package/dist/handlers/snapshot-restore.d.ts +4 -0
  475. package/dist/handlers/snapshot-restore.d.ts.map +1 -0
  476. package/dist/handlers/snapshot-restore.js +27 -0
  477. package/dist/handlers/snapshot-restore.js.map +1 -0
  478. package/dist/handlers/translation-status.d.ts +9 -0
  479. package/dist/handlers/translation-status.d.ts.map +1 -0
  480. package/dist/handlers/translation-status.js +68 -0
  481. package/dist/handlers/translation-status.js.map +1 -0
  482. package/dist/handlers/update-content.d.ts +4 -0
  483. package/dist/handlers/update-content.d.ts.map +1 -0
  484. package/dist/handlers/update-content.js +66 -0
  485. package/dist/handlers/update-content.js.map +1 -0
  486. package/dist/handlers/user-create.d.ts +4 -0
  487. package/dist/handlers/user-create.d.ts.map +1 -0
  488. package/dist/handlers/user-create.js +38 -0
  489. package/dist/handlers/user-create.js.map +1 -0
  490. package/dist/handlers/user-delete.d.ts +4 -0
  491. package/dist/handlers/user-delete.d.ts.map +1 -0
  492. package/dist/handlers/user-delete.js +25 -0
  493. package/dist/handlers/user-delete.js.map +1 -0
  494. package/dist/handlers/user-get.d.ts +4 -0
  495. package/dist/handlers/user-get.d.ts.map +1 -0
  496. package/dist/handlers/user-get.js +22 -0
  497. package/dist/handlers/user-get.js.map +1 -0
  498. package/dist/handlers/user-list.d.ts +4 -0
  499. package/dist/handlers/user-list.d.ts.map +1 -0
  500. package/dist/handlers/user-list.js +28 -0
  501. package/dist/handlers/user-list.js.map +1 -0
  502. package/dist/handlers/user-permissions.d.ts +6 -0
  503. package/dist/handlers/user-permissions.d.ts.map +1 -0
  504. package/dist/handlers/user-permissions.js +42 -0
  505. package/dist/handlers/user-permissions.js.map +1 -0
  506. package/dist/handlers/user-update.d.ts +4 -0
  507. package/dist/handlers/user-update.d.ts.map +1 -0
  508. package/dist/handlers/user-update.js +54 -0
  509. package/dist/handlers/user-update.js.map +1 -0
  510. package/dist/handlers/validate-all.d.ts +4 -0
  511. package/dist/handlers/validate-all.d.ts.map +1 -0
  512. package/dist/handlers/validate-all.js +14 -0
  513. package/dist/handlers/validate-all.js.map +1 -0
  514. package/dist/handlers/version-retention.d.ts +6 -0
  515. package/dist/handlers/version-retention.d.ts.map +1 -0
  516. package/dist/handlers/version-retention.js +40 -0
  517. package/dist/handlers/version-retention.js.map +1 -0
  518. package/dist/handlers/webhook-deliveries.d.ts +4 -0
  519. package/dist/handlers/webhook-deliveries.d.ts.map +1 -0
  520. package/dist/handlers/webhook-deliveries.js +24 -0
  521. package/dist/handlers/webhook-deliveries.js.map +1 -0
  522. package/dist/handlers/webhook-retry.d.ts +11 -0
  523. package/dist/handlers/webhook-retry.d.ts.map +1 -0
  524. package/dist/handlers/webhook-retry.js +69 -0
  525. package/dist/handlers/webhook-retry.js.map +1 -0
  526. package/dist/head.d.ts +9 -0
  527. package/dist/head.d.ts.map +1 -0
  528. package/dist/head.js +28 -0
  529. package/dist/head.js.map +1 -0
  530. package/dist/hooks.d.ts +34 -0
  531. package/dist/hooks.d.ts.map +1 -0
  532. package/dist/hooks.js +19 -0
  533. package/dist/hooks.js.map +1 -0
  534. package/dist/image-cache.d.ts +47 -0
  535. package/dist/image-cache.d.ts.map +1 -0
  536. package/dist/image-cache.js +112 -0
  537. package/dist/image-cache.js.map +1 -0
  538. package/dist/image-dimensions.d.ts +12 -0
  539. package/dist/image-dimensions.d.ts.map +1 -0
  540. package/dist/image-dimensions.js +129 -0
  541. package/dist/image-dimensions.js.map +1 -0
  542. package/dist/image-optimizer.d.ts +86 -0
  543. package/dist/image-optimizer.d.ts.map +1 -0
  544. package/dist/image-optimizer.js +206 -0
  545. package/dist/image-optimizer.js.map +1 -0
  546. package/dist/image-presets.d.ts +17 -0
  547. package/dist/image-presets.d.ts.map +1 -0
  548. package/dist/image-presets.js +50 -0
  549. package/dist/image-presets.js.map +1 -0
  550. package/dist/image-url.d.ts +26 -0
  551. package/dist/image-url.d.ts.map +1 -0
  552. package/dist/image-url.js +47 -0
  553. package/dist/image-url.js.map +1 -0
  554. package/dist/index.d.ts +37 -0
  555. package/dist/index.d.ts.map +1 -0
  556. package/dist/index.js +23 -0
  557. package/dist/index.js.map +1 -0
  558. package/dist/jwt.d.ts +54 -0
  559. package/dist/jwt.d.ts.map +1 -0
  560. package/dist/jwt.js +114 -0
  561. package/dist/jwt.js.map +1 -0
  562. package/dist/locale-fallback.d.ts +18 -0
  563. package/dist/locale-fallback.d.ts.map +1 -0
  564. package/dist/locale-fallback.js +42 -0
  565. package/dist/locale-fallback.js.map +1 -0
  566. package/dist/media-library.d.ts +46 -0
  567. package/dist/media-library.d.ts.map +1 -0
  568. package/dist/media-library.js +231 -0
  569. package/dist/media-library.js.map +1 -0
  570. package/dist/media-reference-updater.d.ts +24 -0
  571. package/dist/media-reference-updater.d.ts.map +1 -0
  572. package/dist/media-reference-updater.js +124 -0
  573. package/dist/media-reference-updater.js.map +1 -0
  574. package/dist/media-references.d.ts +14 -0
  575. package/dist/media-references.d.ts.map +1 -0
  576. package/dist/media-references.js +25 -0
  577. package/dist/media-references.js.map +1 -0
  578. package/dist/merged-schema.d.ts +10 -0
  579. package/dist/merged-schema.d.ts.map +1 -0
  580. package/dist/merged-schema.js +21 -0
  581. package/dist/merged-schema.js.map +1 -0
  582. package/dist/middleware/auth.d.ts +21 -0
  583. package/dist/middleware/auth.d.ts.map +1 -0
  584. package/dist/middleware/auth.js +82 -0
  585. package/dist/middleware/auth.js.map +1 -0
  586. package/dist/oidc-state.d.ts +42 -0
  587. package/dist/oidc-state.d.ts.map +1 -0
  588. package/dist/oidc-state.js +72 -0
  589. package/dist/oidc-state.js.map +1 -0
  590. package/dist/oidc.d.ts +83 -0
  591. package/dist/oidc.d.ts.map +1 -0
  592. package/dist/oidc.js +226 -0
  593. package/dist/oidc.js.map +1 -0
  594. package/dist/openapi.d.ts +13 -0
  595. package/dist/openapi.d.ts.map +1 -0
  596. package/dist/openapi.js +133 -0
  597. package/dist/openapi.js.map +1 -0
  598. package/dist/permissions.d.ts +37 -0
  599. package/dist/permissions.d.ts.map +1 -0
  600. package/dist/permissions.js +69 -0
  601. package/dist/permissions.js.map +1 -0
  602. package/dist/plugins.d.ts +64 -0
  603. package/dist/plugins.d.ts.map +1 -0
  604. package/dist/plugins.js +73 -0
  605. package/dist/plugins.js.map +1 -0
  606. package/dist/preview-token.d.ts +13 -0
  607. package/dist/preview-token.d.ts.map +1 -0
  608. package/dist/preview-token.js +45 -0
  609. package/dist/preview-token.js.map +1 -0
  610. package/dist/public-cache.d.ts +8 -0
  611. package/dist/public-cache.d.ts.map +1 -0
  612. package/dist/public-cache.js +8 -0
  613. package/dist/public-cache.js.map +1 -0
  614. package/dist/reference-resolver.d.ts +21 -0
  615. package/dist/reference-resolver.d.ts.map +1 -0
  616. package/dist/reference-resolver.js +128 -0
  617. package/dist/reference-resolver.js.map +1 -0
  618. package/dist/return-to.d.ts +7 -0
  619. package/dist/return-to.d.ts.map +1 -0
  620. package/dist/return-to.js +15 -0
  621. package/dist/return-to.js.map +1 -0
  622. package/dist/router.d.ts +14 -0
  623. package/dist/router.d.ts.map +1 -0
  624. package/dist/router.js +51 -0
  625. package/dist/router.js.map +1 -0
  626. package/dist/runtime-field-checks.d.ts +11 -0
  627. package/dist/runtime-field-checks.d.ts.map +1 -0
  628. package/dist/runtime-field-checks.js +72 -0
  629. package/dist/runtime-field-checks.js.map +1 -0
  630. package/dist/save-document.d.ts +71 -0
  631. package/dist/save-document.d.ts.map +1 -0
  632. package/dist/save-document.js +213 -0
  633. package/dist/save-document.js.map +1 -0
  634. package/dist/seo-compose.d.ts +50 -0
  635. package/dist/seo-compose.d.ts.map +1 -0
  636. package/dist/seo-compose.js +104 -0
  637. package/dist/seo-compose.js.map +1 -0
  638. package/dist/seo-config-snapshot.d.ts +10 -0
  639. package/dist/seo-config-snapshot.d.ts.map +1 -0
  640. package/dist/seo-config-snapshot.js +16 -0
  641. package/dist/seo-config-snapshot.js.map +1 -0
  642. package/dist/seo-loader.d.ts +10 -0
  643. package/dist/seo-loader.d.ts.map +1 -0
  644. package/dist/seo-loader.js +14 -0
  645. package/dist/seo-loader.js.map +1 -0
  646. package/dist/seo-site-findings.d.ts +27 -0
  647. package/dist/seo-site-findings.d.ts.map +1 -0
  648. package/dist/seo-site-findings.js +87 -0
  649. package/dist/seo-site-findings.js.map +1 -0
  650. package/dist/seo-subsystem.d.ts +28 -0
  651. package/dist/seo-subsystem.d.ts.map +1 -0
  652. package/dist/seo-subsystem.js +62 -0
  653. package/dist/seo-subsystem.js.map +1 -0
  654. package/dist/seo-validation.d.ts +20 -0
  655. package/dist/seo-validation.d.ts.map +1 -0
  656. package/dist/seo-validation.js +96 -0
  657. package/dist/seo-validation.js.map +1 -0
  658. package/dist/types.d.ts +126 -0
  659. package/dist/types.d.ts.map +1 -0
  660. package/dist/types.js +6 -0
  661. package/dist/types.js.map +1 -0
  662. package/dist/validators.d.ts +107 -0
  663. package/dist/validators.d.ts.map +1 -0
  664. package/dist/validators.js +199 -0
  665. package/dist/validators.js.map +1 -0
  666. package/dist/webhooks.d.ts +29 -0
  667. package/dist/webhooks.d.ts.map +1 -0
  668. package/dist/webhooks.js +123 -0
  669. package/dist/webhooks.js.map +1 -0
  670. package/dist/workload-identity.d.ts +23 -0
  671. package/dist/workload-identity.d.ts.map +1 -0
  672. package/dist/workload-identity.js +145 -0
  673. package/dist/workload-identity.js.map +1 -0
  674. package/package.json +51 -3
  675. package/README.md +0 -3
@@ -0,0 +1,86 @@
1
+ import type { MediaSection } from '@krantho/config';
2
+ import type { ImageFormat, ImagePreset } from './image-presets.js';
3
+ /** Result of normalizing an uploaded image */
4
+ export interface NormalizeResult {
5
+ buffer: Buffer;
6
+ width: number;
7
+ height: number;
8
+ mimeType: string;
9
+ }
10
+ /** Result of generating an image variant */
11
+ export interface VariantResult {
12
+ bytes: Buffer;
13
+ contentType: string;
14
+ width: number;
15
+ height: number;
16
+ }
17
+ /** Dimension overrides for cropping and hotspot */
18
+ export interface DimensionOverrides {
19
+ aspectRatio?: string | undefined;
20
+ /** Crop region as percentages (0-100) — applied before resize */
21
+ crop?: {
22
+ x: number;
23
+ y: number;
24
+ width: number;
25
+ height: number;
26
+ } | undefined;
27
+ /** Hotspot center + ellipse for adaptive aspect-ratio cropping (0-100%) */
28
+ hotspot?: {
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ } | undefined;
34
+ }
35
+ /** Image processing settings, as the configuration tree declares them */
36
+ export type ImageSettings = MediaSection['image'];
37
+ /**
38
+ * Image processing pipeline using sharp.
39
+ *
40
+ * Handles upload normalization (EXIF, cap dimensions, JPEG re-encode)
41
+ * and on-demand variant generation (resize to preset, format conversion).
42
+ */
43
+ export declare class ImageOptimizer {
44
+ private readonly settings;
45
+ private sharpFn;
46
+ constructor(settings: ImageSettings);
47
+ /**
48
+ * Normalize an uploaded image:
49
+ * 1. Auto-orient from EXIF
50
+ * 2. Cap width to maxWidth
51
+ * 3. Re-encode as JPEG at the configured normalize quality
52
+ *
53
+ * Returns the normalized buffer and detected dimensions.
54
+ * Skips normalization for SVG (returns input unchanged).
55
+ */
56
+ normalize(buffer: Uint8Array, mimeType: string): Promise<NormalizeResult>;
57
+ /**
58
+ * Generate a resized variant for serving.
59
+ *
60
+ * Resizes to the preset width (preserving aspect ratio) and encodes
61
+ * to the requested format. If overrides specify an aspect ratio,
62
+ * applies center crop before resizing.
63
+ */
64
+ generateVariant(buffer: Uint8Array, preset: ImagePreset, format: ImageFormat, overrides?: DimensionOverrides): Promise<VariantResult>;
65
+ /** Pixel width for a preset. Null means serve at the original size. */
66
+ private presetWidth;
67
+ /** Apply a percentage-based crop region, converting to pixel coordinates */
68
+ private applyCrop;
69
+ /**
70
+ * Hotspot-aware aspect crop: crop to a target aspect ratio, keeping the
71
+ * hotspot center visible. Then resize to target width.
72
+ *
73
+ * Only the hotspot center (x, y) is used for positioning. The hotspot
74
+ * width/height (ellipse) are stored for Studio visualization but do not
75
+ * affect the image processing.
76
+ *
77
+ * Example: a 3:2 landscape photo served as 1:1 thumbnail — the crop
78
+ * centers on the hotspot instead of the image center.
79
+ */
80
+ private applyHotspotCrop;
81
+ /** Lazy-load sharp to avoid loading native bindings until needed */
82
+ private getSharp;
83
+ }
84
+ /** Compute an ETag from image bytes (first 8 chars of SHA-256) */
85
+ export declare function computeEtag(bytes: Uint8Array): string;
86
+ //# sourceMappingURL=image-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-optimizer.d.ts","sourceRoot":"","sources":["../src/image-optimizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKlE,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,iEAAiE;IACjE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAC1E,2EAA2E;IAC3E,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CAC9E;AAED,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;AAKjD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,OAAO,CAAqB;gBAExB,QAAQ,EAAE,aAAa;IAInC;;;;;;;;OAQG;IACG,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB/E;;;;;;OAMG;IACG,eAAe,CACnB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,aAAa,CAAC;IA0EzB,uEAAuE;IACvE,OAAO,CAAC,WAAW;IAInB,4EAA4E;YAC9D,SAAS;IAmBvB;;;;;;;;;;OAUG;YACW,gBAAgB;IA2C9B,oEAAoE;YACtD,QAAQ;CAOvB;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD"}
@@ -0,0 +1,206 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getContentType } from './image-presets.js';
3
+ // SVG should not be processed by sharp
4
+ const SKIP_NORMALIZE_TYPES = new Set(['image/svg+xml']);
5
+ /**
6
+ * Image processing pipeline using sharp.
7
+ *
8
+ * Handles upload normalization (EXIF, cap dimensions, JPEG re-encode)
9
+ * and on-demand variant generation (resize to preset, format conversion).
10
+ */
11
+ export class ImageOptimizer {
12
+ settings;
13
+ sharpFn;
14
+ constructor(settings) {
15
+ this.settings = settings;
16
+ }
17
+ /**
18
+ * Normalize an uploaded image:
19
+ * 1. Auto-orient from EXIF
20
+ * 2. Cap width to maxWidth
21
+ * 3. Re-encode as JPEG at the configured normalize quality
22
+ *
23
+ * Returns the normalized buffer and detected dimensions.
24
+ * Skips normalization for SVG (returns input unchanged).
25
+ */
26
+ async normalize(buffer, mimeType) {
27
+ if (SKIP_NORMALIZE_TYPES.has(mimeType)) {
28
+ return {
29
+ buffer: Buffer.from(buffer),
30
+ width: 0,
31
+ height: 0,
32
+ mimeType,
33
+ };
34
+ }
35
+ const sharpFn = await this.getSharp();
36
+ const result = await sharpFn(Buffer.from(buffer))
37
+ .rotate() // Auto-orient from EXIF
38
+ .resize({ width: this.settings.maxWidth, withoutEnlargement: true })
39
+ .jpeg({ quality: this.settings.quality.normalize })
40
+ .toBuffer({ resolveWithObject: true });
41
+ return {
42
+ buffer: result.data,
43
+ width: result.info.width,
44
+ height: result.info.height,
45
+ mimeType: 'image/jpeg',
46
+ };
47
+ }
48
+ /**
49
+ * Generate a resized variant for serving.
50
+ *
51
+ * Resizes to the preset width (preserving aspect ratio) and encodes
52
+ * to the requested format. If overrides specify an aspect ratio,
53
+ * applies center crop before resizing.
54
+ */
55
+ async generateVariant(buffer, preset, format, overrides) {
56
+ const sharpFn = await this.getSharp();
57
+ const targetWidth = this.presetWidth(preset);
58
+ let pipeline = sharpFn(Buffer.from(buffer)).rotate();
59
+ // Hotspot-aware aspect crop takes precedence over explicit crop — they are
60
+ // mutually exclusive because hotspot crop operates on the original image coordinates.
61
+ if (overrides?.hotspot && overrides.aspectRatio && targetWidth) {
62
+ const [wRatio, hRatio] = parseAspectRatio(overrides.aspectRatio);
63
+ if (wRatio && hRatio) {
64
+ pipeline = await this.applyHotspotCrop(pipeline, buffer, overrides.hotspot, wRatio / hRatio, targetWidth);
65
+ }
66
+ }
67
+ else {
68
+ // Apply percentage-based crop region when hotspot+aspect is not active
69
+ if (overrides?.crop) {
70
+ pipeline = await this.applyCrop(pipeline, buffer, overrides.crop);
71
+ }
72
+ if (overrides?.aspectRatio) {
73
+ // Apply explicit aspect ratio crop
74
+ const [wRatio, hRatio] = parseAspectRatio(overrides.aspectRatio);
75
+ if (wRatio && hRatio && targetWidth) {
76
+ const targetHeight = Math.round(targetWidth * (hRatio / wRatio));
77
+ pipeline = pipeline.resize({
78
+ width: targetWidth,
79
+ height: targetHeight,
80
+ fit: 'cover',
81
+ });
82
+ }
83
+ }
84
+ else if (targetWidth) {
85
+ // Standard resize — preserve aspect ratio, no upscaling
86
+ pipeline = pipeline.resize({
87
+ width: targetWidth,
88
+ withoutEnlargement: true,
89
+ });
90
+ }
91
+ // 'full' preset: no resize at all
92
+ }
93
+ // Encode to target format
94
+ switch (format) {
95
+ case 'webp':
96
+ pipeline = pipeline.webp({ quality: this.settings.quality.webp });
97
+ break;
98
+ case 'jpeg':
99
+ pipeline = pipeline.jpeg({ quality: this.settings.quality.jpeg });
100
+ break;
101
+ case 'png':
102
+ pipeline = pipeline.png();
103
+ break;
104
+ case 'avif':
105
+ pipeline = pipeline.avif({ quality: this.settings.quality.avif });
106
+ break;
107
+ }
108
+ const result = await pipeline.toBuffer({ resolveWithObject: true });
109
+ const contentType = getContentType(format);
110
+ return {
111
+ bytes: result.data,
112
+ contentType,
113
+ width: result.info.width,
114
+ height: result.info.height,
115
+ };
116
+ }
117
+ /** Pixel width for a preset. Null means serve at the original size. */
118
+ presetWidth(preset) {
119
+ return this.settings.presets[preset] ?? null;
120
+ }
121
+ /** Apply a percentage-based crop region, converting to pixel coordinates */
122
+ async applyCrop(pipeline, buffer, crop) {
123
+ const sharpFn = await this.getSharp();
124
+ const metadata = await sharpFn(Buffer.from(buffer)).metadata();
125
+ if (metadata.width && metadata.height) {
126
+ const left = Math.round((crop.x / 100) * metadata.width);
127
+ const top = Math.round((crop.y / 100) * metadata.height);
128
+ const width = Math.round((crop.width / 100) * metadata.width);
129
+ const height = Math.round((crop.height / 100) * metadata.height);
130
+ if (width > 0 && height > 0) {
131
+ return pipeline.extract({ left, top, width, height });
132
+ }
133
+ }
134
+ return pipeline;
135
+ }
136
+ /**
137
+ * Hotspot-aware aspect crop: crop to a target aspect ratio, keeping the
138
+ * hotspot center visible. Then resize to target width.
139
+ *
140
+ * Only the hotspot center (x, y) is used for positioning. The hotspot
141
+ * width/height (ellipse) are stored for Studio visualization but do not
142
+ * affect the image processing.
143
+ *
144
+ * Example: a 3:2 landscape photo served as 1:1 thumbnail — the crop
145
+ * centers on the hotspot instead of the image center.
146
+ */
147
+ async applyHotspotCrop(pipeline, buffer, hotspot, targetAspect, targetWidth) {
148
+ const sharpFn = await this.getSharp();
149
+ const metadata = await sharpFn(Buffer.from(buffer)).metadata();
150
+ if (!metadata.width || !metadata.height)
151
+ return pipeline;
152
+ const srcW = metadata.width;
153
+ const srcH = metadata.height;
154
+ const srcAspect = srcW / srcH;
155
+ // Compute the largest crop region at the target aspect that fits the source
156
+ let cropW;
157
+ let cropH;
158
+ if (targetAspect > srcAspect) {
159
+ // Target is wider — constrain by width
160
+ cropW = srcW;
161
+ cropH = Math.round(srcW / targetAspect);
162
+ }
163
+ else {
164
+ // Target is taller — constrain by height
165
+ cropH = srcH;
166
+ cropW = Math.round(srcH * targetAspect);
167
+ }
168
+ // Hotspot center in pixels
169
+ const hotX = Math.round((hotspot.x / 100) * srcW);
170
+ const hotY = Math.round((hotspot.y / 100) * srcH);
171
+ // Center crop on hotspot, clamp to image bounds
172
+ let left = Math.round(hotX - cropW / 2);
173
+ let top = Math.round(hotY - cropH / 2);
174
+ left = Math.max(0, Math.min(left, srcW - cropW));
175
+ top = Math.max(0, Math.min(top, srcH - cropH));
176
+ return pipeline
177
+ .extract({ left, top, width: cropW, height: cropH })
178
+ .resize({ width: targetWidth, withoutEnlargement: true });
179
+ }
180
+ /** Lazy-load sharp to avoid loading native bindings until needed */
181
+ async getSharp() {
182
+ if (!this.sharpFn) {
183
+ const mod = await import('sharp');
184
+ this.sharpFn = mod.default;
185
+ }
186
+ return this.sharpFn;
187
+ }
188
+ }
189
+ /** Compute an ETag from image bytes (first 8 chars of SHA-256) */
190
+ export function computeEtag(bytes) {
191
+ return createHash('sha256').update(bytes).digest('hex').slice(0, 16);
192
+ }
193
+ /** Parse an aspect ratio string like '16:9' into [16, 9] */
194
+ function parseAspectRatio(ratio) {
195
+ const parts = ratio.split(':');
196
+ const rawW = parts[0];
197
+ const rawH = parts[1];
198
+ if (parts.length !== 2 || !rawW || !rawH)
199
+ return [undefined, undefined];
200
+ const w = Number.parseInt(rawW, 10);
201
+ const h = Number.parseInt(rawH, 10);
202
+ if (Number.isNaN(w) || Number.isNaN(h) || w <= 0 || h <= 0)
203
+ return [undefined, undefined];
204
+ return [w, h];
205
+ }
206
+ //# sourceMappingURL=image-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-optimizer.js","sourceRoot":"","sources":["../src/image-optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Image size presets — fixed classes, not arbitrary dimensions */
2
+ export type ImagePreset = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
3
+ /** Supported output formats */
4
+ export type ImageFormat = 'webp' | 'jpeg' | 'png' | 'avif';
5
+ /** Parse and validate a preset string. Returns 'md' as default. */
6
+ export declare function parsePreset(value: string | undefined): ImagePreset;
7
+ /** Parse and validate a format string. Negotiates from Accept header if not explicit. */
8
+ export declare function parseFormat(value: string | undefined, acceptHeader: string | undefined): ImageFormat;
9
+ /** Get the content type for a format */
10
+ export declare function getContentType(format: ImageFormat): string;
11
+ /**
12
+ * Clamp an arbitrary pixel width to the nearest preset.
13
+ *
14
+ * 0–64 → xs, 65–160 → sm, 161–384 → md, 385–768 → lg, 769+ → xl
15
+ */
16
+ export declare function clampToPreset(width: number): ImagePreset;
17
+ //# sourceMappingURL=image-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-presets.d.ts","sourceRoot":"","sources":["../src/image-presets.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AAEnE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAY1D,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAGlE;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,WAAW,CAWb;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAMxD"}
@@ -0,0 +1,50 @@
1
+ const PRESET_NAMES = new Set(['xs', 'sm', 'md', 'lg', 'xl', 'full']);
2
+ const FORMAT_NAMES = new Set(['webp', 'jpeg', 'png', 'avif']);
3
+ const FORMAT_CONTENT_TYPES = {
4
+ webp: 'image/webp',
5
+ jpeg: 'image/jpeg',
6
+ png: 'image/png',
7
+ avif: 'image/avif',
8
+ };
9
+ /** Parse and validate a preset string. Returns 'md' as default. */
10
+ export function parsePreset(value) {
11
+ if (value && PRESET_NAMES.has(value))
12
+ return value;
13
+ return 'md';
14
+ }
15
+ /** Parse and validate a format string. Negotiates from Accept header if not explicit. */
16
+ export function parseFormat(value, acceptHeader) {
17
+ if (value && FORMAT_NAMES.has(value))
18
+ return value;
19
+ // Negotiate from Accept header — prefer AVIF (smallest), then WebP
20
+ if (acceptHeader) {
21
+ if (acceptHeader.includes('image/avif'))
22
+ return 'avif';
23
+ if (acceptHeader.includes('image/webp'))
24
+ return 'webp';
25
+ if (acceptHeader.includes('image/png'))
26
+ return 'png';
27
+ }
28
+ return 'avif'; // default — best compression
29
+ }
30
+ /** Get the content type for a format */
31
+ export function getContentType(format) {
32
+ return FORMAT_CONTENT_TYPES[format];
33
+ }
34
+ /**
35
+ * Clamp an arbitrary pixel width to the nearest preset.
36
+ *
37
+ * 0–64 → xs, 65–160 → sm, 161–384 → md, 385–768 → lg, 769+ → xl
38
+ */
39
+ export function clampToPreset(width) {
40
+ if (width <= 64)
41
+ return 'xs';
42
+ if (width <= 160)
43
+ return 'sm';
44
+ if (width <= 384)
45
+ return 'md';
46
+ if (width <= 768)
47
+ return 'lg';
48
+ return 'xl';
49
+ }
50
+ //# sourceMappingURL=image-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-presets.js","sourceRoot":"","sources":["../src/image-presets.ts"],"names":[],"mappings":"AAMA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAErE,MAAM,oBAAoB,GAAgC;IACxD,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAoB,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,WAAW,CACzB,KAAyB,EACzB,YAAgC;IAEhC,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAoB,CAAA;IAEjE,mEAAmE;IACnE,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,MAAM,CAAA;QACtD,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,MAAM,CAAA;QACtD,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IAED,OAAO,MAAM,CAAA,CAAC,6BAA6B;AAC7C,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAA;IAC5B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { MediaItem } from '@krantho/persistence';
2
+ import type { ImageFormat, ImagePreset } from './image-presets.js';
3
+ /** One concrete rendition of a media item: every choice made, nothing negotiated */
4
+ export interface ImageVariant {
5
+ preset: ImagePreset;
6
+ /** `original` serves the stored bytes unchanged (SVG without a raster format) */
7
+ format: ImageFormat | 'original';
8
+ aspect: string | undefined;
9
+ }
10
+ /**
11
+ * The item's image revision: changes when the bytes or their framing change
12
+ * (a replace gives a new url; crop and hotspot reshape every variant), and
13
+ * stays put for alt text, tags, folder and rename edits.
14
+ */
15
+ export declare function imageRevision(item: MediaItem): string;
16
+ /**
17
+ * Resolve a request's variant: `w` maps to a preset, `fmt` is explicit or
18
+ * negotiated from `Accept`, and an SVG without an explicit raster format is
19
+ * served as the original.
20
+ */
21
+ export declare function resolveVariant(item: MediaItem, query: Record<string, string | undefined>, headers?: Record<string, string> | undefined): ImageVariant;
22
+ /** The versioned, immutable URL of a variant at a revision */
23
+ export declare function variantUrl(id: string, variant: ImageVariant, rev: string): string;
24
+ /** The in-memory cache key of a rendered variant; a new revision never hits an old entry */
25
+ export declare function variantCacheKey(id: string, variant: ImageVariant, rev: string): string;
26
+ //# sourceMappingURL=image-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-url.d.ts","sourceRoot":"","sources":["../src/image-url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGlE,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAA;IACnB,iFAAiF;IACjF,MAAM,EAAE,WAAW,GAAG,UAAU,CAAA;IAChC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC3C,YAAY,CAId;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtF"}
@@ -0,0 +1,47 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { clampToPreset, parseFormat, parsePreset } from './image-presets.js';
3
+ const SVG = 'image/svg+xml';
4
+ const FORMATS = new Set(['webp', 'jpeg', 'png', 'avif']);
5
+ /** Only N:N ratios, so arbitrary values cannot flood the variant cache */
6
+ const ASPECT_PATTERN = /^\d+:\d+$/;
7
+ /**
8
+ * The item's image revision: changes when the bytes or their framing change
9
+ * (a replace gives a new url; crop and hotspot reshape every variant), and
10
+ * stays put for alt text, tags, folder and rename edits.
11
+ */
12
+ export function imageRevision(item) {
13
+ const source = `${item.url}|${JSON.stringify(item.crop)}|${JSON.stringify(item.hotspot)}`;
14
+ return createHash('sha256').update(source).digest('hex').slice(0, 12);
15
+ }
16
+ /**
17
+ * Resolve a request's variant: `w` maps to a preset, `fmt` is explicit or
18
+ * negotiated from `Accept`, and an SVG without an explicit raster format is
19
+ * served as the original.
20
+ */
21
+ export function resolveVariant(item, query, headers) {
22
+ const rawAspect = query['aspect'];
23
+ const aspect = rawAspect && ASPECT_PATTERN.test(rawAspect) ? rawAspect : undefined;
24
+ return { preset: resolvePreset(query), format: resolveFormat(item, query, headers), aspect };
25
+ }
26
+ /** The versioned, immutable URL of a variant at a revision */
27
+ export function variantUrl(id, variant, rev) {
28
+ const aspect = variant.aspect ? `&aspect=${variant.aspect}` : '';
29
+ return `/api/media/${encodeURIComponent(id)}/image?preset=${variant.preset}&fmt=${variant.format}${aspect}&rev=${rev}`;
30
+ }
31
+ /** The in-memory cache key of a rendered variant; a new revision never hits an old entry */
32
+ export function variantCacheKey(id, variant, rev) {
33
+ return `${id}/${rev}/${variant.preset}/${variant.format}/${variant.aspect ?? ''}`;
34
+ }
35
+ function resolvePreset(query) {
36
+ const rawW = query['w'];
37
+ const width = rawW ? Number.parseInt(rawW, 10) : Number.NaN;
38
+ return Number.isNaN(width) ? parsePreset(query['preset']) : clampToPreset(width);
39
+ }
40
+ function resolveFormat(item, query, headers) {
41
+ const fmt = query['fmt'];
42
+ const explicitRaster = fmt !== undefined && FORMATS.has(fmt);
43
+ if (item.mimeType === SVG && !explicitRaster)
44
+ return 'original';
45
+ return parseFormat(fmt, headers?.['accept']);
46
+ }
47
+ //# sourceMappingURL=image-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-url.js","sourceRoot":"","sources":["../src/image-url.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type { AssistantActivity, AssistantChatRequest, AssistantDoneReason, AssistantErrorCode, AssistantEvent, DocumentChange, DocumentRef, FieldChange, PendingActionKind, PendingActionView, SeoFinding, } from './assistant/protocol.js';
2
+ export { deliverChange, deliverChanges } from './content-change.js';
3
+ export { accessCookieName, buildCookie, refreshCookieName } from './cookies.js';
4
+ export type { ApiHandlers, CreateApiHandlersConfig } from './create-api-handlers.js';
5
+ export { createApiHandlers } from './create-api-handlers.js';
6
+ export { createContent, deleteContent, getContent, getSchema, getVersion, listCollection, listCollections, listContent, listContentTree, listVersions, mediaDelete, mediaGet, mediaImage, mediaImageInfo, mediaList, mediaRegister, mediaUpdate, mediaUpload, publishContent, resolvePageRoute, restoreVersion, updateContent, validateAll, } from './handlers/index.js';
7
+ export { storedBaseUrlSetting, storedModelSetting } from './handlers/llm-credential.js';
8
+ export type { AfterMutationContext, BeforeSaveContext, ContentHooks } from './hooks.js';
9
+ export type { CachedVariant, ImageCacheSettings } from './image-cache.js';
10
+ export { ImageCache } from './image-cache.js';
11
+ export type { ImageDimensions } from './image-dimensions.js';
12
+ export { detectDimensions } from './image-dimensions.js';
13
+ export type { ImageSettings } from './image-optimizer.js';
14
+ export { ImageOptimizer } from './image-optimizer.js';
15
+ export type { ImageFormat, ImagePreset } from './image-presets.js';
16
+ export { clampToPreset, getContentType, parseFormat, parsePreset, } from './image-presets.js';
17
+ export type { ImageVariant } from './image-url.js';
18
+ export { imageRevision, resolveVariant, variantUrl } from './image-url.js';
19
+ export type { JwtClaims } from './jwt.js';
20
+ export { resolveJwtSecret, verifyJwt } from './jwt.js';
21
+ export type { MediaLibrarySettings } from './media-library.js';
22
+ export { MediaLibrary } from './media-library.js';
23
+ export type { AuthResult } from './middleware/auth.js';
24
+ export { checkAuth } from './middleware/auth.js';
25
+ export type { KranthoPlugin, PluginFieldType, PluginRegistry, PluginRoute, PluginStudioPage, } from './plugins.js';
26
+ export { loadPlugins } from './plugins.js';
27
+ export { PREVIEW_PARAM, verifyPreviewToken } from './preview-token.js';
28
+ export { ApiRouter } from './router.js';
29
+ export type { PageJsonLdInput } from './seo-compose.js';
30
+ export { composePageJsonLd } from './seo-compose.js';
31
+ export { startSeo } from './seo-subsystem.js';
32
+ export type { ApiContext, ApiHandler, ApiRequest, ApiResponse, AuthenticatedUser, ContentItemResponse, ErrorResponse, MediaConfig, ServerFramework, SitePreviewMode, WebhookConfig, } from './types.js';
33
+ export { hasVersioning } from './types.js';
34
+ export { parseCookie } from './validators.js';
35
+ export { processWebhookRetries } from './webhooks.js';
36
+ export { checkWorkloadAuth, WORKLOAD_PATHS } from './workload-identity.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ export { deliverChange, deliverChanges } from './content-change.js';
2
+ export { accessCookieName, buildCookie, refreshCookieName } from './cookies.js';
3
+ export { createApiHandlers } from './create-api-handlers.js';
4
+ export { createContent, deleteContent, getContent, getSchema, getVersion, listCollection, listCollections, listContent, listContentTree, listVersions, mediaDelete, mediaGet, mediaImage, mediaImageInfo, mediaList, mediaRegister, mediaUpdate, mediaUpload, publishContent, resolvePageRoute, restoreVersion, updateContent, validateAll, } from './handlers/index.js';
5
+ export { storedBaseUrlSetting, storedModelSetting } from './handlers/llm-credential.js';
6
+ export { ImageCache } from './image-cache.js';
7
+ export { detectDimensions } from './image-dimensions.js';
8
+ export { ImageOptimizer } from './image-optimizer.js';
9
+ export { clampToPreset, getContentType, parseFormat, parsePreset, } from './image-presets.js';
10
+ export { imageRevision, resolveVariant, variantUrl } from './image-url.js';
11
+ export { resolveJwtSecret, verifyJwt } from './jwt.js';
12
+ export { MediaLibrary } from './media-library.js';
13
+ export { checkAuth } from './middleware/auth.js';
14
+ export { loadPlugins } from './plugins.js';
15
+ export { PREVIEW_PARAM, verifyPreviewToken } from './preview-token.js';
16
+ export { ApiRouter } from './router.js';
17
+ export { composePageJsonLd } from './seo-compose.js';
18
+ export { startSeo } from './seo-subsystem.js';
19
+ export { hasVersioning } from './types.js';
20
+ export { parseCookie } from './validators.js';
21
+ export { processWebhookRetries } from './webhooks.js';
22
+ export { checkWorkloadAuth, WORKLOAD_PATHS } from './workload-identity.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAGvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAQhD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAc7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
package/dist/jwt.d.ts ADDED
@@ -0,0 +1,54 @@
1
+ import type { AuthSection } from '@krantho/config';
2
+ import type { Role } from '@krantho/persistence';
3
+ /** Claims embedded in a krantho access token JWT */
4
+ export interface JwtClaims {
5
+ /** User ID (UUID) */
6
+ sub: string;
7
+ /** User email */
8
+ email: string;
9
+ /** Display name */
10
+ name: string;
11
+ /** Assigned roles */
12
+ roles: Role[];
13
+ /** Issued at (unix seconds) */
14
+ iat: number;
15
+ /** Expires at (unix seconds) */
16
+ exp: number;
17
+ }
18
+ /** Result of verifying a JWT */
19
+ export type VerifyResult = {
20
+ valid: true;
21
+ claims: JwtClaims;
22
+ } | {
23
+ valid: false;
24
+ error: string;
25
+ };
26
+ /**
27
+ * Sign a JWT with HS256.
28
+ *
29
+ * @param claims - Token claims (sub, email, name, roles)
30
+ * @param secret - HMAC secret (`config.auth.jwtSecret`)
31
+ * @param expiresInSeconds - Token lifetime in seconds (default: 900 = 15 minutes)
32
+ */
33
+ export declare function signJwt(claims: Omit<JwtClaims, 'iat' | 'exp'>, secret: string, expiresInSeconds?: number): string;
34
+ /**
35
+ * Verify a JWT signature and check expiry.
36
+ *
37
+ * @param token - The full JWT string
38
+ * @param secret - HMAC secret (must match the signing secret)
39
+ */
40
+ export declare function verifyJwt(token: string, secret: string): VerifyResult;
41
+ /** Generate a cryptographically random refresh token (64 hex chars) */
42
+ export declare function generateRefreshToken(): string;
43
+ /** Hash a refresh token for database storage */
44
+ export declare function hashRefreshToken(token: string, secret: string): string;
45
+ /** Generate a random JWT secret (for dev mode when none is configured) */
46
+ export declare function generateJwtSecret(): string;
47
+ /**
48
+ * The effective signing secret: the configured one (KRANTHO_JWT_SECRET beats a
49
+ * `jwtSecret` set in code, as the config tree resolves it), or, when neither is
50
+ * set, one ephemeral secret for the whole process — generated with a warning —
51
+ * so the API and the pages it serves (a signed preview link) agree on it.
52
+ */
53
+ export declare function resolveJwtSecret(auth: Pick<AuthSection, 'jwtSecret'>): string;
54
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAmB/F;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,gBAAgB,SAAM,GACrB,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAyCrE;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAcD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,CAW7E"}