@jini-ai/admin 0.4.2 → 0.4.4

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 (361) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +7 -0
  3. package/dist/agent-plugins/react/components/AgentPluginListPanel.d.ts +1 -1
  4. package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.js +1 -1
  5. package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.d.ts +1 -1
  6. package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.d.ts +1 -1
  7. package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.js +1 -1
  8. package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.d.ts +1 -1
  9. package/dist/agent-plugins/react/index.js +1 -1
  10. package/dist/agent-plugins/react/pages/AgentPluginsPage.d.ts +1 -1
  11. package/dist/agent-plugins/react/tabs/DownloadedTab.d.ts +1 -1
  12. package/dist/agent-plugins/react/tabs/InstalledTab.d.ts +1 -1
  13. package/dist/agent-plugins/react/tabs/MarketplaceTab.d.ts +1 -1
  14. package/dist/comments/adapters/http.d.ts +29 -0
  15. package/dist/comments/adapters/http.js +50 -0
  16. package/dist/comments/adapters/memory.d.ts +17 -0
  17. package/dist/comments/adapters/memory.js +61 -0
  18. package/dist/comments/comments.module.d.ts +73 -0
  19. package/dist/comments/comments.module.js +16 -0
  20. package/dist/comments/conformance/comments-api.conformance.d.ts +9 -0
  21. package/dist/comments/conformance/comments-api.conformance.js +63 -0
  22. package/dist/comments/controllers/comment-queue.controller.d.ts +48 -0
  23. package/dist/comments/controllers/comment-queue.controller.js +164 -0
  24. package/dist/comments/controllers/comment-settings.controller.d.ts +32 -0
  25. package/dist/comments/controllers/comment-settings.controller.js +77 -0
  26. package/dist/comments/controllers/comments.controller.d.ts +16 -0
  27. package/dist/comments/controllers/comments.controller.js +16 -0
  28. package/dist/comments/index.d.ts +13 -0
  29. package/dist/comments/index.js +8 -0
  30. package/dist/comments/messages.en.d.ts +54 -0
  31. package/dist/comments/messages.en.js +56 -0
  32. package/dist/comments/models.d.ts +22 -0
  33. package/dist/comments/models.js +2 -0
  34. package/dist/comments/ports.d.ts +14 -0
  35. package/dist/comments/ports.js +5 -0
  36. package/dist/comments/react/components/QueueSection.d.ts +30 -0
  37. package/dist/comments/react/components/QueueSection.js +57 -0
  38. package/dist/comments/react/components/SettingsSection.d.ts +14 -0
  39. package/dist/comments/react/components/SettingsSection.js +23 -0
  40. package/dist/comments/react/hooks/CommentsPage.hooks.d.ts +9 -0
  41. package/dist/comments/react/hooks/CommentsPage.hooks.js +10 -0
  42. package/dist/comments/react/hooks/CommentsPorts.hooks.d.ts +13 -0
  43. package/dist/comments/react/hooks/CommentsPorts.hooks.js +15 -0
  44. package/dist/comments/react/hooks/QueueSection.hooks.d.ts +62 -0
  45. package/dist/comments/react/hooks/QueueSection.hooks.js +57 -0
  46. package/dist/comments/react/hooks/SettingsSection.hooks.d.ts +12 -0
  47. package/dist/comments/react/hooks/SettingsSection.hooks.js +21 -0
  48. package/dist/comments/react/hooks/use-comment-queue.hooks.d.ts +34 -0
  49. package/dist/comments/react/hooks/use-comment-queue.hooks.js +47 -0
  50. package/dist/comments/react/hooks/use-comment-settings.hooks.d.ts +22 -0
  51. package/dist/comments/react/hooks/use-comment-settings.hooks.js +30 -0
  52. package/dist/comments/react/hooks/use-comments.hooks.d.ts +15 -0
  53. package/dist/comments/react/hooks/use-comments.hooks.js +20 -0
  54. package/dist/comments/react/index.d.ts +316 -0
  55. package/dist/comments/react/index.js +35 -0
  56. package/dist/comments/react/pages/CommentsPage.d.ts +12 -0
  57. package/dist/comments/react/pages/CommentsPage.js +15 -0
  58. package/dist/comments/rules.d.ts +140 -0
  59. package/dist/comments/rules.js +199 -0
  60. package/dist/core/index.d.ts +3 -1
  61. package/dist/core/index.js +1 -0
  62. package/dist/core/ledger-slice.d.ts +90 -0
  63. package/dist/core/ledger-slice.js +81 -0
  64. package/dist/core/ports/comments.d.ts +2 -0
  65. package/dist/core/ports/forms.d.ts +19 -7
  66. package/dist/core/ports/forms.js +4 -4
  67. package/dist/core/ports/index.d.ts +1 -1
  68. package/dist/core/ports/seo.d.ts +33 -6
  69. package/dist/core/react/bind-react.d.ts +46 -0
  70. package/dist/core/react/bind-react.js +28 -0
  71. package/dist/core/react/index.d.ts +3 -0
  72. package/dist/core/react/index.js +3 -0
  73. package/dist/core/react/use-controller.d.ts +16 -0
  74. package/dist/core/react/use-controller.js +18 -0
  75. package/dist/forms/adapters/http.d.ts +26 -0
  76. package/dist/forms/adapters/http.js +43 -0
  77. package/dist/forms/adapters/memory.d.ts +14 -0
  78. package/dist/forms/adapters/memory.js +77 -0
  79. package/dist/forms/conformance/forms-api.conformance.d.ts +17 -0
  80. package/dist/forms/conformance/forms-api.conformance.js +71 -0
  81. package/dist/forms/controllers/draft-store.d.ts +18 -0
  82. package/dist/forms/controllers/draft-store.js +17 -0
  83. package/dist/forms/controllers/field-attributes-dialog.controller.d.ts +37 -0
  84. package/dist/forms/controllers/field-attributes-dialog.controller.js +27 -0
  85. package/dist/forms/controllers/form-editor.controller.d.ts +36 -0
  86. package/dist/forms/controllers/form-editor.controller.js +22 -0
  87. package/dist/forms/controllers/form-fields-editor.controller.d.ts +20 -0
  88. package/dist/forms/controllers/form-fields-editor.controller.js +10 -0
  89. package/dist/forms/controllers/form-submission-detail.controller.d.ts +20 -0
  90. package/dist/forms/controllers/form-submission-detail.controller.js +10 -0
  91. package/dist/forms/controllers/form-submissions.controller.d.ts +25 -0
  92. package/dist/forms/controllers/form-submissions.controller.js +10 -0
  93. package/dist/forms/controllers/forms-list.controller.d.ts +22 -0
  94. package/dist/forms/controllers/forms-list.controller.js +10 -0
  95. package/dist/forms/forms.module.d.ts +138 -0
  96. package/dist/forms/forms.module.js +17 -0
  97. package/dist/forms/html-rules.d.ts +34 -0
  98. package/dist/forms/html-rules.js +34 -0
  99. package/dist/forms/index.d.ts +14 -0
  100. package/dist/forms/index.js +12 -0
  101. package/dist/forms/messages.en.d.ts +101 -0
  102. package/dist/forms/messages.en.js +105 -0
  103. package/dist/forms/models.d.ts +29 -0
  104. package/dist/forms/models.js +8 -0
  105. package/dist/forms/ports.d.ts +26 -0
  106. package/dist/forms/ports.js +6 -0
  107. package/dist/forms/react/components/FieldAttributesDialog.d.ts +14 -0
  108. package/dist/forms/react/components/FieldAttributesDialog.js +47 -0
  109. package/dist/forms/react/components/FormEditorFieldsBody.d.ts +28 -0
  110. package/dist/forms/react/components/FormEditorFieldsBody.js +24 -0
  111. package/dist/forms/react/components/FormEditorHeaderText.d.ts +7 -0
  112. package/dist/forms/react/components/FormEditorHeaderText.js +8 -0
  113. package/dist/forms/react/components/FormEditorMainPanel.d.ts +12 -0
  114. package/dist/forms/react/components/FormEditorMainPanel.js +13 -0
  115. package/dist/forms/react/components/FormEditorTabStrip.d.ts +13 -0
  116. package/dist/forms/react/components/FormEditorTabStrip.js +14 -0
  117. package/dist/forms/react/components/FormFieldsEditor.d.ts +13 -0
  118. package/dist/forms/react/components/FormFieldsEditor.js +39 -0
  119. package/dist/forms/react/components/FormSubmissionDate.d.ts +8 -0
  120. package/dist/forms/react/components/FormSubmissionDate.js +5 -0
  121. package/dist/forms/react/components/FormSubmissionDetail.d.ts +15 -0
  122. package/dist/forms/react/components/FormSubmissionDetail.js +30 -0
  123. package/dist/forms/react/components/FormSubmissions.d.ts +12 -0
  124. package/dist/forms/react/components/FormSubmissions.js +46 -0
  125. package/dist/forms/react/hooks/FormsPorts.hooks.d.ts +41 -0
  126. package/dist/forms/react/hooks/FormsPorts.hooks.js +16 -0
  127. package/dist/forms/react/hooks/forms-view.hooks.d.ts +117 -0
  128. package/dist/forms/react/hooks/forms-view.hooks.js +78 -0
  129. package/dist/forms/react/hooks/use-field-attributes-dialog.hooks.d.ts +31 -0
  130. package/dist/forms/react/hooks/use-field-attributes-dialog.hooks.js +22 -0
  131. package/dist/forms/react/hooks/use-form-editor.hooks.d.ts +118 -0
  132. package/dist/forms/react/hooks/use-form-editor.hooks.js +208 -0
  133. package/dist/forms/react/hooks/use-form-fields-editor.hooks.d.ts +34 -0
  134. package/dist/forms/react/hooks/use-form-fields-editor.hooks.js +36 -0
  135. package/dist/forms/react/hooks/use-form-submission-date.hooks.d.ts +12 -0
  136. package/dist/forms/react/hooks/use-form-submission-date.hooks.js +9 -0
  137. package/dist/forms/react/hooks/use-form-submission-detail.hooks.d.ts +68 -0
  138. package/dist/forms/react/hooks/use-form-submission-detail.hooks.js +81 -0
  139. package/dist/forms/react/hooks/use-form-submissions.hooks.d.ts +67 -0
  140. package/dist/forms/react/hooks/use-form-submissions.hooks.js +110 -0
  141. package/dist/forms/react/hooks/use-forms-list.hooks.d.ts +78 -0
  142. package/dist/forms/react/hooks/use-forms-list.hooks.js +103 -0
  143. package/dist/forms/react/index.d.ts +452 -0
  144. package/dist/forms/react/index.js +35 -0
  145. package/dist/forms/react/pages/FormEditor.d.ts +19 -0
  146. package/dist/forms/react/pages/FormEditor.js +40 -0
  147. package/dist/forms/react/pages/FormsList.d.ts +39 -0
  148. package/dist/forms/react/pages/FormsList.js +50 -0
  149. package/dist/forms/rules.d.ts +291 -0
  150. package/dist/forms/rules.js +338 -0
  151. package/dist/media/react/hooks/EditMediaPanel.hooks.js +1 -1
  152. package/dist/media/react/hooks/LibraryTab.hooks.d.ts +1 -1
  153. package/dist/media/react/hooks/LibraryTab.hooks.js +1 -1
  154. package/dist/media/react/hooks/MediaCard.hooks.js +6 -20
  155. package/dist/media/react/hooks/MediaGrid.hooks.d.ts +2 -2
  156. package/dist/media/react/hooks/MediaPage.hooks.d.ts +1 -1
  157. package/dist/media/react/hooks/MediaPage.hooks.js +1 -1
  158. package/dist/media/react/hooks/MediaPicker.hooks.js +1 -1
  159. package/dist/media/react/index.js +1 -1
  160. package/dist/media/react/tabs/LibraryTab.d.ts +1 -1
  161. package/dist/media/react/tabs/ProvidersTab.d.ts +1 -1
  162. package/dist/playground/react/components/Canvas.d.ts +1 -1
  163. package/dist/playground/react/hooks/Canvas.hooks.d.ts +1 -1
  164. package/dist/playground/react/hooks/Canvas.hooks.js +1 -1
  165. package/dist/playground/react/hooks/PlaygroundPage.hooks.d.ts +1 -1
  166. package/dist/playground/react/index.js +1 -1
  167. package/dist/playground/react/pages/PlaygroundPage.d.ts +1 -1
  168. package/dist/playground/react/tabs/CanvasTab.d.ts +1 -1
  169. package/dist/react/bind-react.d.ts +1 -45
  170. package/dist/react/bind-react.js +2 -27
  171. package/dist/react/components/ConfirmDialog/ConfirmDialog.d.ts +22 -5
  172. package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.d.ts +2 -2
  173. package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.js +17 -55
  174. package/dist/react/components/ConfirmDialog/ConfirmDialog.js +33 -70
  175. package/dist/react/components/RowMenu/RowMenu.hooks.js +14 -3
  176. package/dist/react/use-controller.d.ts +1 -15
  177. package/dist/react/use-controller.js +2 -17
  178. package/dist/redirects/adapters/http.d.ts +20 -0
  179. package/dist/redirects/adapters/http.js +31 -0
  180. package/dist/redirects/adapters/memory.d.ts +13 -0
  181. package/dist/redirects/adapters/memory.js +83 -0
  182. package/dist/redirects/conformance/redirects-api.conformance.d.ts +12 -0
  183. package/dist/redirects/conformance/redirects-api.conformance.js +66 -0
  184. package/dist/redirects/controllers/hit-count.controller.d.ts +14 -0
  185. package/dist/redirects/controllers/hit-count.controller.js +10 -0
  186. package/dist/redirects/controllers/import-redirects.controller.d.ts +28 -0
  187. package/dist/redirects/controllers/import-redirects.controller.js +29 -0
  188. package/dist/redirects/controllers/redirects.controller.d.ts +37 -0
  189. package/dist/redirects/controllers/redirects.controller.js +38 -0
  190. package/dist/redirects/index.d.ts +11 -0
  191. package/dist/redirects/index.js +10 -0
  192. package/dist/redirects/messages.en.d.ts +58 -0
  193. package/dist/redirects/messages.en.js +60 -0
  194. package/dist/redirects/models.d.ts +14 -0
  195. package/dist/redirects/models.js +2 -0
  196. package/dist/redirects/ports.d.ts +9 -0
  197. package/dist/redirects/ports.js +4 -0
  198. package/dist/redirects/react/components/HitCountCell.d.ts +19 -0
  199. package/dist/redirects/react/components/HitCountCell.js +19 -0
  200. package/dist/redirects/react/components/ImportRedirectsForm.d.ts +17 -0
  201. package/dist/redirects/react/components/ImportRedirectsForm.js +12 -0
  202. package/dist/redirects/react/hooks/RedirectsOptions.hooks.d.ts +27 -0
  203. package/dist/redirects/react/hooks/RedirectsOptions.hooks.js +15 -0
  204. package/dist/redirects/react/hooks/RedirectsPage.hooks.d.ts +50 -0
  205. package/dist/redirects/react/hooks/RedirectsPage.hooks.js +30 -0
  206. package/dist/redirects/react/hooks/RedirectsPorts.hooks.d.ts +10 -0
  207. package/dist/redirects/react/hooks/RedirectsPorts.hooks.js +11 -0
  208. package/dist/redirects/react/hooks/use-hit-count-cell.hooks.d.ts +19 -0
  209. package/dist/redirects/react/hooks/use-hit-count-cell.hooks.js +15 -0
  210. package/dist/redirects/react/hooks/use-import-redirects-form.hooks.d.ts +21 -0
  211. package/dist/redirects/react/hooks/use-import-redirects-form.hooks.js +25 -0
  212. package/dist/redirects/react/hooks/use-redirects.hooks.d.ts +34 -0
  213. package/dist/redirects/react/hooks/use-redirects.hooks.js +63 -0
  214. package/dist/redirects/react/hooks/wired.hooks.d.ts +55 -0
  215. package/dist/redirects/react/hooks/wired.hooks.js +31 -0
  216. package/dist/redirects/react/index.d.ts +324 -0
  217. package/dist/redirects/react/index.js +28 -0
  218. package/dist/redirects/react/pages/RedirectsPage.d.ts +15 -0
  219. package/dist/redirects/react/pages/RedirectsPage.js +20 -0
  220. package/dist/redirects/redirects.module.d.ts +77 -0
  221. package/dist/redirects/redirects.module.js +13 -0
  222. package/dist/redirects/rules.d.ts +131 -0
  223. package/dist/redirects/rules.js +134 -0
  224. package/dist/security/react/hooks/AccessTokensTab.hooks.d.ts +1 -1
  225. package/dist/security/react/hooks/AccessTokensTab.hooks.js +1 -1
  226. package/dist/security/react/hooks/RootKeyTab.hooks.d.ts +1 -1
  227. package/dist/security/react/hooks/RootKeyTab.hooks.js +1 -1
  228. package/dist/security/react/hooks/SecurityPage.hooks.d.ts +1 -1
  229. package/dist/security/react/index.js +1 -1
  230. package/dist/security/react/pages/SecurityPage.d.ts +1 -1
  231. package/dist/security/react/tabs/AccessTokensTab.d.ts +1 -1
  232. package/dist/security/react/tabs/RootKeyTab.d.ts +1 -1
  233. package/dist/seo/adapters/http.d.ts +31 -0
  234. package/dist/seo/adapters/http.js +37 -0
  235. package/dist/seo/adapters/memory.d.ts +28 -0
  236. package/dist/seo/adapters/memory.js +129 -0
  237. package/dist/seo/conformance/seo-api.conformance.d.ts +8 -0
  238. package/dist/seo/conformance/seo-api.conformance.js +44 -0
  239. package/dist/seo/controllers/entry-picker.controller.d.ts +21 -0
  240. package/dist/seo/controllers/entry-picker.controller.js +17 -0
  241. package/dist/seo/controllers/entry-section.controller.d.ts +20 -0
  242. package/dist/seo/controllers/entry-section.controller.js +7 -0
  243. package/dist/seo/controllers/media-ref.controller.d.ts +26 -0
  244. package/dist/seo/controllers/media-ref.controller.js +14 -0
  245. package/dist/seo/controllers/seo-entry.controller.d.ts +31 -0
  246. package/dist/seo/controllers/seo-entry.controller.js +52 -0
  247. package/dist/seo/controllers/seo.controller.d.ts +29 -0
  248. package/dist/seo/controllers/seo.controller.js +50 -0
  249. package/dist/seo/controllers/sitemap.controller.d.ts +25 -0
  250. package/dist/seo/controllers/sitemap.controller.js +27 -0
  251. package/dist/seo/index.d.ts +14 -0
  252. package/dist/seo/index.js +12 -0
  253. package/dist/seo/messages.en.d.ts +79 -0
  254. package/dist/seo/messages.en.js +79 -0
  255. package/dist/seo/models.d.ts +179 -0
  256. package/dist/seo/models.js +8 -0
  257. package/dist/seo/ports.d.ts +11 -0
  258. package/dist/seo/ports.js +4 -0
  259. package/dist/seo/react/components/MediaPickerBridge.d.ts +4 -0
  260. package/dist/seo/react/components/MediaPickerBridge.js +8 -0
  261. package/dist/seo/react/components/MediaRefField.d.ts +40 -0
  262. package/dist/seo/react/components/MediaRefField.js +12 -0
  263. package/dist/seo/react/components/SeoIcons.d.ts +13 -0
  264. package/dist/seo/react/components/SeoIcons.js +32 -0
  265. package/dist/seo/react/components/SitemapModal.d.ts +48 -0
  266. package/dist/seo/react/components/SitemapModal.js +72 -0
  267. package/dist/seo/react/hooks/MediaPickerBridge.hooks.d.ts +6 -0
  268. package/dist/seo/react/hooks/MediaPickerBridge.hooks.js +27 -0
  269. package/dist/seo/react/hooks/MediaRefField.hooks.d.ts +25 -0
  270. package/dist/seo/react/hooks/MediaRefField.hooks.js +30 -0
  271. package/dist/seo/react/hooks/SeoModuleTabs.d.ts +14 -0
  272. package/dist/seo/react/hooks/SeoModuleTabs.js +18 -0
  273. package/dist/seo/react/hooks/SeoPage.hooks.d.ts +69 -0
  274. package/dist/seo/react/hooks/SeoPage.hooks.js +37 -0
  275. package/dist/seo/react/hooks/SeoPorts.hooks.d.ts +19 -0
  276. package/dist/seo/react/hooks/SeoPorts.hooks.js +22 -0
  277. package/dist/seo/react/hooks/SitemapModal.hooks.d.ts +26 -0
  278. package/dist/seo/react/hooks/SitemapModal.hooks.js +20 -0
  279. package/dist/seo/react/hooks/use-entry-picker.hooks.d.ts +11 -0
  280. package/dist/seo/react/hooks/use-entry-picker.hooks.js +20 -0
  281. package/dist/seo/react/hooks/use-seo-entry-panel.hooks.d.ts +14 -0
  282. package/dist/seo/react/hooks/use-seo-entry-panel.hooks.js +26 -0
  283. package/dist/seo/react/hooks/use-seo-entry-section.hooks.d.ts +4 -0
  284. package/dist/seo/react/hooks/use-seo-entry-section.hooks.js +7 -0
  285. package/dist/seo/react/hooks/use-seo.hooks.d.ts +11 -0
  286. package/dist/seo/react/hooks/use-seo.hooks.js +29 -0
  287. package/dist/seo/react/hooks/use-sitemap-modal.hooks.d.ts +10 -0
  288. package/dist/seo/react/hooks/use-sitemap-modal.hooks.js +18 -0
  289. package/dist/seo/react/index.d.ts +369 -0
  290. package/dist/seo/react/index.js +30 -0
  291. package/dist/seo/react/options.d.ts +26 -0
  292. package/dist/seo/react/options.js +2 -0
  293. package/dist/seo/react/pages/SeoPage.d.ts +161 -0
  294. package/dist/seo/react/pages/SeoPage.js +215 -0
  295. package/dist/seo/rules.d.ts +142 -0
  296. package/dist/seo/rules.js +220 -0
  297. package/dist/seo/seo.module.d.ts +115 -0
  298. package/dist/seo/seo.module.js +14 -0
  299. package/dist/source-control/react/hooks/ProvidersTab.hooks.d.ts +1 -1
  300. package/dist/source-control/react/hooks/ProvidersTab.hooks.js +1 -1
  301. package/dist/source-control/react/hooks/SourceControlPage.hooks.d.ts +1 -1
  302. package/dist/source-control/react/index.js +1 -1
  303. package/dist/source-control/react/pages/SourceControlPage.d.ts +1 -1
  304. package/dist/source-control/react/tabs/ProvidersTab.d.ts +1 -1
  305. package/dist/widgets/adapters/http.d.ts +19 -0
  306. package/dist/widgets/adapters/http.js +33 -0
  307. package/dist/widgets/adapters/memory.d.ts +22 -0
  308. package/dist/widgets/adapters/memory.js +93 -0
  309. package/dist/widgets/conformance/widgets-api.conformance.d.ts +6 -0
  310. package/dist/widgets/conformance/widgets-api.conformance.js +55 -0
  311. package/dist/widgets/controllers/instance-editor.controller.d.ts +49 -0
  312. package/dist/widgets/controllers/instance-editor.controller.js +87 -0
  313. package/dist/widgets/controllers/library.controller.d.ts +33 -0
  314. package/dist/widgets/controllers/library.controller.js +53 -0
  315. package/dist/widgets/controllers/region-editor.controller.d.ts +42 -0
  316. package/dist/widgets/controllers/region-editor.controller.js +69 -0
  317. package/dist/widgets/controllers/regions.controller.d.ts +27 -0
  318. package/dist/widgets/controllers/regions.controller.js +44 -0
  319. package/dist/widgets/index.d.ts +11 -0
  320. package/dist/widgets/index.js +9 -0
  321. package/dist/widgets/messages.en.d.ts +78 -0
  322. package/dist/widgets/messages.en.js +83 -0
  323. package/dist/widgets/models.d.ts +62 -0
  324. package/dist/widgets/models.js +2 -0
  325. package/dist/widgets/ports.d.ts +79 -0
  326. package/dist/widgets/ports.js +5 -0
  327. package/dist/widgets/react/components/WidgetInstanceNotices.d.ts +14 -0
  328. package/dist/widgets/react/components/WidgetInstanceNotices.js +25 -0
  329. package/dist/widgets/react/components/WidgetRegionEditorHeaderActions.d.ts +22 -0
  330. package/dist/widgets/react/components/WidgetRegionEditorHeaderActions.js +18 -0
  331. package/dist/widgets/react/components/WidgetsLibraryNotices.d.ts +13 -0
  332. package/dist/widgets/react/components/WidgetsLibraryNotices.js +10 -0
  333. package/dist/widgets/react/hooks/WidgetsPorts.hooks.d.ts +270 -0
  334. package/dist/widgets/react/hooks/WidgetsPorts.hooks.js +17 -0
  335. package/dist/widgets/react/hooks/navigation.hooks.d.ts +9 -0
  336. package/dist/widgets/react/hooks/navigation.hooks.js +6 -0
  337. package/dist/widgets/react/hooks/page-views.hooks.d.ts +87 -0
  338. package/dist/widgets/react/hooks/page-views.hooks.js +30 -0
  339. package/dist/widgets/react/hooks/use-widget-instance-editor.hooks.d.ts +56 -0
  340. package/dist/widgets/react/hooks/use-widget-instance-editor.hooks.js +38 -0
  341. package/dist/widgets/react/hooks/use-widget-region-editor.hooks.d.ts +32 -0
  342. package/dist/widgets/react/hooks/use-widget-region-editor.hooks.js +22 -0
  343. package/dist/widgets/react/hooks/use-widget-regions.hooks.d.ts +23 -0
  344. package/dist/widgets/react/hooks/use-widget-regions.hooks.js +22 -0
  345. package/dist/widgets/react/hooks/use-widgets-library.hooks.d.ts +37 -0
  346. package/dist/widgets/react/hooks/use-widgets-library.hooks.js +23 -0
  347. package/dist/widgets/react/index.d.ts +391 -0
  348. package/dist/widgets/react/index.js +31 -0
  349. package/dist/widgets/react/pages/WidgetInstanceEditor.d.ts +23 -0
  350. package/dist/widgets/react/pages/WidgetInstanceEditor.js +37 -0
  351. package/dist/widgets/react/pages/WidgetRegionEditor.d.ts +22 -0
  352. package/dist/widgets/react/pages/WidgetRegionEditor.js +25 -0
  353. package/dist/widgets/react/pages/WidgetRegions.d.ts +21 -0
  354. package/dist/widgets/react/pages/WidgetRegions.js +31 -0
  355. package/dist/widgets/react/pages/WidgetsLibrary.d.ts +24 -0
  356. package/dist/widgets/react/pages/WidgetsLibrary.js +61 -0
  357. package/dist/widgets/rules.d.ts +94 -0
  358. package/dist/widgets/rules.js +83 -0
  359. package/dist/widgets/widgets.module.d.ts +122 -0
  360. package/dist/widgets/widgets.module.js +21 -0
  361. package/package.json +206 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.4 — 2026-10-08
4
+
5
+ - Desktop 0.1.13 release fixes: see commits a2659d24 (admin), 5695a7c3 (chat, agent-runtime), 8ad4ac5c (devops).
6
+
7
+ ## 0.4.3
8
+
9
+ ### Patch Changes
10
+
11
+ - Tovu clean-up release (2026-10-08): code Tovu moved into Jini, plus the Jini clean-up (see the commit log since 0.4.2).
12
+
3
13
  ## 0.4.2 — 2026-10-05
4
14
 
5
15
  - Catalog provider settings: on a host without `saveChanges`, a provider the last read did not return (a catalog-only provider's first key or settings) is now written instead of silently dropped while the tab reported Saved.
@@ -21,6 +31,11 @@
21
31
 
22
32
  ## Unreleased
23
33
 
34
+ - Add portable Forms admin screens, HTTP/memory adapters and core-port conformance under ./forms*.
35
+ - Add composable comments admin queue/settings module with HTTP and memory adapters and API conformance.
36
+ - Add portable redirects admin module, React list, HTTP/memory adapters and API conformance.
37
+ - Add portable SEO admin settings, sitemap viewer, entry overrides and analysis with HTTP/memory adapters and API conformance.
38
+ - Add composable widgets admin screens, headless controllers, HTTP/memory adapters and API conformance.
24
39
  - Media Providers tab on hosts without `saveChanges`: saving the first key or
25
40
  settings of a catalog provider the last read did not return now writes them
26
41
  (previously nothing was written, yet the tab showed "Saved").
package/README.md CHANGED
@@ -173,3 +173,10 @@ its presence does not imply matcher support. Hosts must verify support before of
173
173
  React controls keep importing `agentHandle` and `buildAgentListHandles` from
174
174
  `@jini-ai/agentic`; this is an allowed UI-to-agentic layer dependency. The helpers
175
175
  have not moved and consumers continue to use their original exports.
176
+
177
+ Shared React binding helpers are also available from `@jini-ai/admin/core/react`.
178
+ This is an explicit browser adapter entry: `@jini-ai/admin/core` and the package
179
+ root remain framework free. Domain React entries call these shared helpers
180
+ directly, and the existing `react/bind-react` and `react/use-controller` entries
181
+ retain their exports through compatibility re-exports. Domain integration
182
+ packages are optional peers; install the peers used by the selected entries.
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function AgentPluginListPanel({ props, mode }: {
3
3
  props: TabViewProps;
4
4
  mode: 'installed' | 'downloaded';
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useId, useRef, useState } from 'react';
2
- import { useController } from '../../../react/use-controller.js';
2
+ import { useController } from '../../../core/react/use-controller.js';
3
3
  import { createAgentPluginFilesController } from '../../controllers/agent-plugin-files.controller.js';
4
4
  import { useAgentPluginsPorts } from './AgentPluginsPorts.hooks.js';
5
5
  import { AGENT_PLUGINS_READ, agentPluginFileNotice, selectAgentPluginFile } from '../../rules.js';
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function useAgentPluginPanel({ props, mode }: {
3
3
  props: TabViewProps;
4
4
  mode: 'installed' | 'downloaded';
@@ -1,4 +1,4 @@
1
- import type { ModulePageProps } from '../../../react/bind-react.js';
1
+ import type { ModulePageProps } from '../../../core/react/bind-react.js';
2
2
  import { createAgentPluginsController } from '../../controllers/agent-plugins.controller.js';
3
3
  import type { AgentPluginsState } from '../../models.js';
4
4
  export interface AgentPluginsPageScope {
@@ -1,5 +1,5 @@
1
1
  import { createContext, useContext, useId, useState } from 'react';
2
- import { useController } from '../../../react/use-controller.js';
2
+ import { useController } from '../../../core/react/use-controller.js';
3
3
  import { createAgentPluginsController } from '../../controllers/agent-plugins.controller.js';
4
4
  import { AGENT_PLUGINS_READ, agentPluginDisableCopy, humanizeAgentPluginId } from '../../rules.js';
5
5
  import { useAgentPluginsPorts } from './AgentPluginsPorts.hooks.js';
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function useMarketplaceTab({ permissions }: TabViewProps, _optional?: {}): {
3
3
  denied: boolean;
4
4
  specUrl: string;
@@ -1,4 +1,4 @@
1
- import { bindReact } from '../../react/bind-react.js';
1
+ import { bindReact } from '../../core/react/bind-react.js';
2
2
  import { agentPluginsModule } from '../agent-plugins.module.js';
3
3
  import { AgentPluginsPortsContext } from './hooks/AgentPluginsPorts.hooks.js';
4
4
  import { agentPluginsMessagesEn as m } from '../messages.en.js';
@@ -1,4 +1,4 @@
1
- import type { ModulePageProps } from '../../../react/bind-react.js';
1
+ import type { ModulePageProps } from '../../../core/react/bind-react.js';
2
2
  export declare function AgentPluginsPage(props: ModulePageProps, _optional?: {}): import("react").JSX.Element;
3
3
  export default AgentPluginsPage;
4
4
  //# sourceMappingURL=AgentPluginsPage.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function DownloadedTab(props: TabViewProps, _optional?: {}): import("react").JSX.Element;
3
3
  export default DownloadedTab;
4
4
  //# sourceMappingURL=DownloadedTab.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function InstalledTab(props: TabViewProps, _optional?: {}): import("react").JSX.Element;
3
3
  export default InstalledTab;
4
4
  //# sourceMappingURL=InstalledTab.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { TabViewProps } from '../../../react/bind-react.js';
1
+ import type { TabViewProps } from '../../../core/react/bind-react.js';
2
2
  export declare function MarketplaceTab(props: TabViewProps, _optional?: {}): import("react").JSX.Element;
3
3
  export default MarketplaceTab;
4
4
  //# sourceMappingURL=MarketplaceTab.d.ts.map
@@ -0,0 +1,29 @@
1
+ import type { AdminCommentsPort } from '../../core/ports/comments.js';
2
+ import type { CommentsSessionPort } from '../ports.js';
3
+ /** The host owns auth, URL prefixes, retries, serialization, and decoded status/body errors. */
4
+ export interface CommentsTransportPort {
5
+ request<T>(required: {
6
+ path: string;
7
+ method: 'GET' | 'POST' | 'PUT';
8
+ body?: unknown;
9
+ }, optional?: {
10
+ signal?: AbortSignal;
11
+ }): Promise<T>;
12
+ url(required: {
13
+ path: string;
14
+ }, optional?: Record<string, never>): string;
15
+ }
16
+ /** Adapt the existing workspace comments routes to the core port, unwrapping settings only.
17
+ * @param required Host transport and comments base path, e.g. `/workspaces/<id>/comments`.
18
+ * @returns The core comments API. Decoded status/body fields adopt the shared core error type.
19
+ */
20
+ export declare function createHttpCommentsApi({ transport, basePath }: {
21
+ transport: CommentsTransportPort;
22
+ basePath: string;
23
+ }, _optional?: Record<string, never>): AdminCommentsPort;
24
+ /** Reuse the core auth `me` contract over the host's existing auth path. */
25
+ export declare function createHttpCommentsSession({ transport, path }: {
26
+ transport: CommentsTransportPort;
27
+ path: string;
28
+ }, _optional?: Record<string, never>): CommentsSessionPort;
29
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1,50 @@
1
+ import { AdminApiError } from '../../core/transport/errors.js';
2
+ /** Preserve the host's decoded fields while adopting the shared core error owner. */
3
+ async function request({ transport, ...required }, optional = {}) {
4
+ try {
5
+ return await transport.request(required, optional);
6
+ }
7
+ catch (error) {
8
+ if (error instanceof AdminApiError || !(error instanceof Error) || !('status' in error) || typeof error.status !== 'number')
9
+ throw error;
10
+ const decoded = error;
11
+ throw new AdminApiError({ message: decoded.message, status: decoded.status }, { code: decoded.code, body: decoded.body });
12
+ }
13
+ }
14
+ /** Adapt the existing workspace comments routes to the core port, unwrapping settings only.
15
+ * @param required Host transport and comments base path, e.g. `/workspaces/<id>/comments`.
16
+ * @returns The core comments API. Decoded status/body fields adopt the shared core error type.
17
+ */
18
+ export function createHttpCommentsApi({ transport, basePath }, _optional = {}) {
19
+ const base = basePath.replace(/\/$/, '');
20
+ return {
21
+ listCommentsQueue(_required, options = {}) {
22
+ const params = new URLSearchParams();
23
+ if (options.status)
24
+ params.set('status', options.status);
25
+ if (options.cursor)
26
+ params.set('cursor', options.cursor);
27
+ if (options.limit)
28
+ params.set('limit', String(options.limit));
29
+ const qs = params.toString();
30
+ return request({ transport, path: `${base}/queue${qs ? `?${qs}` : ''}`, method: 'GET' });
31
+ },
32
+ async moderateComment({ commentId, action, expectedVersion }, options = {}) {
33
+ await request({ transport, path: `${base}/${encodeURIComponent(commentId)}/${action}`, method: 'POST', body: { expectedVersion, note: options.note } });
34
+ },
35
+ async purgeComment({ commentId }, options = {}) {
36
+ await request({ transport, path: `${base}/${encodeURIComponent(commentId)}/purge`, method: 'POST', body: { note: options.note } });
37
+ },
38
+ async getCommentsSettings(_required, _options = {}) {
39
+ return (await request({ transport, path: `${base}/settings`, method: 'GET' })).data;
40
+ },
41
+ async putCommentsSettings(_required, patch = {}) {
42
+ return (await request({ transport, path: `${base}/settings`, method: 'PUT', body: patch })).data;
43
+ },
44
+ };
45
+ }
46
+ /** Reuse the core auth `me` contract over the host's existing auth path. */
47
+ export function createHttpCommentsSession({ transport, path }, _optional = {}) {
48
+ return { me: (_required, _options = {}) => request({ transport, path, method: 'GET' }) };
49
+ }
50
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1,17 @@
1
+ import type { AdminComment, AdminCommentsPort, CommentsSettings } from '../../core/ports/comments.js';
2
+ /** Isolated admin contract fixture over the existing CMS memory repository.
3
+ * Keyset paging, optimistic concurrency and deletion belong to that repository, not this screen.
4
+ * Settings here are an ephemeral read-your-writes fixture; production persistence stays in the
5
+ * host's layered settings ledger. No ingress, auth, outbox or trash-index service is simulated.
6
+ * @param required Seeded comments and settings, copied so later writes cannot alter input fixtures.
7
+ * @param optional Workspace scope and deterministic clock for moderation metadata.
8
+ * @returns The core API with immutable snapshots and decoded status/body errors.
9
+ */
10
+ export declare function createMemoryCommentsApi({ items, settings }: {
11
+ items?: readonly AdminComment[];
12
+ settings?: CommentsSettings;
13
+ }, { workspaceId, now }?: {
14
+ workspaceId?: string;
15
+ now?: () => string;
16
+ }): AdminCommentsPort;
17
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1,61 @@
1
+ import { InMemoryCommentRepo } from '@jini-ai/cms/comments';
2
+ import { optionalOneOf, readToolLimit } from '@jini-ai/core';
3
+ import { AdminApiError } from '../../core/transport/errors.js';
4
+ const DEFAULT_SETTINGS = {
5
+ enabled: true, requireModeration: true, maxDepth: 5, closeAfterDays: null,
6
+ spamAutoRejectScore: 0.5, maxPerIpPerHour: 20,
7
+ };
8
+ /** Isolated admin contract fixture over the existing CMS memory repository.
9
+ * Keyset paging, optimistic concurrency and deletion belong to that repository, not this screen.
10
+ * Settings here are an ephemeral read-your-writes fixture; production persistence stays in the
11
+ * host's layered settings ledger. No ingress, auth, outbox or trash-index service is simulated.
12
+ * @param required Seeded comments and settings, copied so later writes cannot alter input fixtures.
13
+ * @param optional Workspace scope and deterministic clock for moderation metadata.
14
+ * @returns The core API with immutable snapshots and decoded status/body errors.
15
+ */
16
+ export function createMemoryCommentsApi({ items = [], settings = DEFAULT_SETTINGS }, { workspaceId = items[0]?.workspaceId ?? '__comments-memory__', now = () => '2026-10-07T00:00:00.000Z' } = {}) {
17
+ const repo = new InMemoryCommentRepo({ initialComments: items.map(item => ({ ...item, workspaceId: item.workspaceId ?? workspaceId })) });
18
+ let storedSettings = Object.freeze({ ...settings });
19
+ function failure(message, status, body) {
20
+ throw new AdminApiError({ message, status }, { body });
21
+ }
22
+ return {
23
+ async listCommentsQueue(_required, options = {}) {
24
+ // Same validators as the moderation-queue route: omitted limit is 20, >100 is capped.
25
+ const status = optionalOneOf({ input: options, key: 'status', values: ['pending', 'approved', 'spam', 'trash'] }) ?? 'pending';
26
+ const limit = readToolLimit({ input: options, max: 100, fallback: 20 });
27
+ const page = await repo.listModerationQueue({ workspaceId, status, limit, ...(options.cursor ? { cursor: options.cursor } : {}) });
28
+ return Object.freeze({ items: Object.freeze(page.items.map(item => Object.freeze({ ...item }))), nextCursor: page.nextCursor });
29
+ },
30
+ async moderateComment({ commentId, action, expectedVersion }, { note } = {}) {
31
+ const statuses = { approve: 'approved', spam: 'spam', trash: 'trash', restore: 'approved' };
32
+ const toStatus = Object.hasOwn(statuses, action) ? statuses[action] : undefined;
33
+ if (!toStatus)
34
+ failure('Invalid moderation action', 400);
35
+ const result = await repo.applyModeration({ workspaceId, id: commentId, expectedVersion,
36
+ action: action === 'spam' ? 'mark_spam' : action, toStatus,
37
+ actorPrincipalId: '__admin-memory__', note: note ?? null, at: now() });
38
+ if (!result.ok)
39
+ failure(result.reason === 'conflict' ? 'Comment changed' : 'Comment was not found', result.reason === 'conflict' ? 409 : 404, result.reason === 'conflict' ? { currentVersion: result.currentVersion } : undefined);
40
+ },
41
+ async purgeComment({ commentId }, { note } = {}) {
42
+ const result = await repo.purge({ workspaceId, id: commentId, actorPrincipalId: '__admin-memory__', note: note ?? null, at: now() });
43
+ if (!result.ok)
44
+ failure('Comment was not found', 404);
45
+ },
46
+ async getCommentsSettings(_required, _options = {}) { return Object.freeze({ ...storedSettings }); },
47
+ async putCommentsSettings(_required, patch = {}) {
48
+ // Only fixture-level shape checks: the durable ledger remains the production validator.
49
+ const next = { ...storedSettings, ...patch };
50
+ if (typeof next.enabled !== 'boolean' || typeof next.requireModeration !== 'boolean'
51
+ || !Number.isInteger(next.maxDepth) || next.maxDepth < 0 || next.maxDepth > 20
52
+ || (next.closeAfterDays !== null && (!Number.isInteger(next.closeAfterDays) || next.closeAfterDays < 0))
53
+ || !Number.isFinite(next.spamAutoRejectScore) || next.spamAutoRejectScore < 0 || next.spamAutoRejectScore > 1
54
+ || !Number.isInteger(next.maxPerIpPerHour) || next.maxPerIpPerHour < 1 || next.maxPerIpPerHour > 1000)
55
+ failure('Invalid Comments settings', 400);
56
+ storedSettings = Object.freeze(next);
57
+ return Object.freeze({ ...storedSettings });
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1,73 @@
1
+ export declare const commentsModule: {
2
+ readonly id: "comments";
3
+ readonly requires: {
4
+ readonly commentsApi: import("../core/module/token.js").AdminPortToken<import("./index.js").AdminCommentsPort, "admin.comments.api">;
5
+ readonly commentsSession: import("../core/module/token.js").AdminPortToken<import("./ports.js").CommentsSessionPort, "admin.comments.session">;
6
+ };
7
+ readonly optional: {
8
+ readonly commentsEvents: import("../core/module/token.js").AdminPortToken<import("./ports.js").CommentsEventsPort, "admin.comments.events">;
9
+ };
10
+ readonly messages: {
11
+ readonly Status: "Status";
12
+ readonly "Actions for the comment by \"{author}\"": "Actions for the comment by \"{author}\"";
13
+ readonly Author: "Author";
14
+ readonly Comment: "Comment";
15
+ readonly Depth: "Depth";
16
+ readonly Created: "Created";
17
+ readonly More: "More";
18
+ readonly "Loading\u2026": "Loading…";
19
+ readonly "Load more": "Load more";
20
+ readonly "Loading comments\u2026": "Loading comments…";
21
+ readonly "No {status} comments.": "No {status} comments.";
22
+ readonly "Permanently delete this comment?": "Permanently delete this comment?";
23
+ readonly "Permanently delete this comment by \"{author}\"? This cannot be undone.": "Permanently delete this comment by \"{author}\"? This cannot be undone.";
24
+ readonly "Permanently delete": "Permanently delete";
25
+ readonly "Loading Comments settings\u2026": "Loading Comments settings…";
26
+ readonly Settings: "Settings";
27
+ readonly "Comments enabled": "Comments enabled";
28
+ readonly "Require moderation (new comments start pending)": "Require moderation (new comments start pending)";
29
+ readonly "Max thread depth": "Max thread depth";
30
+ readonly "Close submissions after (days, blank = never)": "Close submissions after (days, blank = never)";
31
+ readonly "Spam auto-reject score (0\u20131)": "Spam auto-reject score (0–1)";
32
+ readonly "Max submissions per IP per hour": "Max submissions per IP per hour";
33
+ readonly "Saving\u2026": "Saving…";
34
+ readonly "Save settings": "Save settings";
35
+ readonly "Loading Comments\u2026": "Loading Comments…";
36
+ readonly People: "People";
37
+ readonly Comments: "Comments";
38
+ readonly "Moderate incoming comments and configure workspace-wide comment behavior.": "Moderate incoming comments and configure workspace-wide comment behavior.";
39
+ readonly "You do not have permission to view the moderation queue.": "You do not have permission to view the moderation queue.";
40
+ readonly "This comment changed since you loaded it (current version {currentVersion}) \u2014 refresh and try again.": "This comment changed since you loaded it (current version {currentVersion}) — refresh and try again.";
41
+ readonly "This comment changed since you loaded it \u2014 refresh and try again.": "This comment changed since you loaded it — refresh and try again.";
42
+ readonly "Failed to update comment.": "Failed to update comment.";
43
+ readonly Approve: "Approve";
44
+ readonly Spam: "Spam";
45
+ readonly Trash: "Trash";
46
+ readonly Restore: "Restore";
47
+ readonly Purge: "Purge";
48
+ readonly "Spam auto-reject score must be between 0 and 1.": "Spam auto-reject score must be between 0 and 1.";
49
+ readonly "failed to load the moderation queue": "failed to load the moderation queue";
50
+ readonly "Failed to purge comment.": "Failed to purge comment.";
51
+ readonly "Saved.": "Saved.";
52
+ readonly "failed to save Comments settings": "failed to save Comments settings";
53
+ readonly "failed to load Comments settings": "failed to load Comments settings";
54
+ readonly pending: "Pending";
55
+ readonly approved: "Approved";
56
+ readonly spam: "Spam";
57
+ readonly trash: "Trash";
58
+ };
59
+ readonly pages: {
60
+ readonly queue: {
61
+ readonly path: "/comments";
62
+ readonly label: "Comments";
63
+ readonly permissions: readonly ["comments.read"];
64
+ readonly agentReachable: true;
65
+ readonly nav: {
66
+ readonly group: "people";
67
+ readonly icon: "message-circle";
68
+ };
69
+ readonly tabs: {};
70
+ };
71
+ };
72
+ };
73
+ //# sourceMappingURL=comments.module.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { defineAdminModule } from '../core/module/define-admin-module.js';
2
+ import { commentsApiToken, commentsSessionToken, commentsEventsToken } from './ports.js';
3
+ import { commentsMessagesEn } from './messages.en.js';
4
+ export const commentsModule = defineAdminModule({
5
+ id: 'comments',
6
+ requires: { commentsApi: commentsApiToken, commentsSession: commentsSessionToken },
7
+ optional: { commentsEvents: commentsEventsToken },
8
+ messages: commentsMessagesEn,
9
+ pages: {
10
+ queue: {
11
+ path: '/comments', label: 'Comments', permissions: ['comments.read'],
12
+ agentReachable: true, nav: { group: 'people', icon: 'message-circle' }, tabs: {},
13
+ },
14
+ },
15
+ });
16
+ //# sourceMappingURL=comments.module.js.map
@@ -0,0 +1,9 @@
1
+ import type { AdminCommentsPort } from '../../core/ports/comments.js';
2
+ /** Destructive checklist for an isolated fixture containing at least two pending comments.
3
+ * Uses only the core port, works against HTTP and memory, and throws at the first failed check.
4
+ * @returns Named passed checks. The first seeded comment is purged; never use production data.
5
+ */
6
+ export declare function runCommentsApiConformance({ api }: {
7
+ api: AdminCommentsPort;
8
+ }, _optional?: Record<string, never>): Promise<readonly string[]>;
9
+ //# sourceMappingURL=comments-api.conformance.d.ts.map
@@ -0,0 +1,63 @@
1
+ /** Destructive checklist for an isolated fixture containing at least two pending comments.
2
+ * Uses only the core port, works against HTTP and memory, and throws at the first failed check.
3
+ * @returns Named passed checks. The first seeded comment is purged; never use production data.
4
+ */
5
+ export async function runCommentsApiConformance({ api }, _optional = {}) {
6
+ const checks = [];
7
+ function assert(condition, name) {
8
+ if (!condition)
9
+ throw new Error(`Comments API conformance: ${name}`);
10
+ checks.push(name);
11
+ }
12
+ async function rejects(run, name) {
13
+ let rejected = false;
14
+ try {
15
+ await run();
16
+ }
17
+ catch {
18
+ rejected = true;
19
+ }
20
+ assert(rejected, name);
21
+ }
22
+ const first = await api.listCommentsQueue({}, { status: 'pending', limit: 1 });
23
+ const comment = first.items[0];
24
+ if (!comment || !first.nextCursor)
25
+ throw new Error('Conformance needs at least two pending comments');
26
+ assert(first.items.length === 1 && comment.status === 'pending', 'status and limit filter');
27
+ const second = await api.listCommentsQueue({}, { status: 'pending', limit: 1, cursor: first.nextCursor });
28
+ assert(second.items.length === 1 && second.items[0]?.id !== comment.id, 'cursor advances without repeating rows');
29
+ const settings = await api.getCommentsSettings({});
30
+ const updated = await api.putCommentsSettings({}, { maxDepth: settings.maxDepth + 1, closeAfterDays: null });
31
+ assert(updated.maxDepth === settings.maxDepth + 1 && updated.closeAfterDays === null && updated.enabled === settings.enabled, 'partial settings patch preserves siblings and null');
32
+ assert((await api.getCommentsSettings({})).maxDepth === updated.maxDepth, 'settings read your writes');
33
+ await rejects(() => api.putCommentsSettings({}, { spamAutoRejectScore: 2 }), 'invalid settings patch rejects');
34
+ assert((await api.getCommentsSettings({})).spamAutoRejectScore === settings.spamAutoRejectScore, 'invalid settings patch is atomic');
35
+ let current = comment;
36
+ for (const [action, status] of [['approve', 'approved'], ['spam', 'spam'], ['trash', 'trash'], ['restore', 'approved']]) {
37
+ const reply = await api.moderateComment({ commentId: current.id, action, expectedVersion: current.version });
38
+ assert(reply === undefined, `${action} has no response body`);
39
+ const page = await api.listCommentsQueue({}, { status: status });
40
+ const row = page.items.find(item => item.id === current.id);
41
+ assert(row?.status === status && row.version === current.version + 1, `${action} changes status and increments version`);
42
+ current = row;
43
+ }
44
+ assert(comment.version === first.items[0]?.version && comment.status === 'pending', 'earlier queue snapshot is unchanged');
45
+ try {
46
+ await api.moderateComment({ commentId: current.id, action: 'trash', expectedVersion: comment.version });
47
+ throw new Error('Stale moderation unexpectedly succeeded');
48
+ }
49
+ catch (e) {
50
+ assert(e instanceof Error && 'status' in e && e.status === 409 && 'body' in e
51
+ && e.body?.currentVersion === current.version, 'stale version rejects with status and currentVersion');
52
+ }
53
+ const remaining = await api.listCommentsQueue({}, { status: 'pending', limit: 1, cursor: first.nextCursor });
54
+ assert(remaining.items[0]?.id === second.items[0]?.id, 'cursor survives its marker leaving the status');
55
+ await api.moderateComment({ commentId: current.id, action: 'trash', expectedVersion: current.version });
56
+ assert(await api.purgeComment({ commentId: current.id }) === undefined, 'purge has no version guard or response body');
57
+ assert(!(await api.listCommentsQueue({}, { status: 'trash' })).items.some(item => item.id === current.id), 'purge removes the row');
58
+ await rejects(() => api.purgeComment({ commentId: current.id }), 'missing purge rejects');
59
+ await rejects(() => api.moderateComment({ commentId: current.id, action: 'approve', expectedVersion: current.version }), 'missing moderation rejects');
60
+ await api.putCommentsSettings({}, settings);
61
+ return Object.freeze(checks);
62
+ }
63
+ //# sourceMappingURL=comments-api.conformance.js.map
@@ -0,0 +1,48 @@
1
+ import type { AdminComment, AdminCommentsPort, AdminCommentsQueuePage, CommentModerationAction, CommentStatus } from '../../core/ports/comments.js';
2
+ import type { CommentQueueState } from '../models.js';
3
+ import { type RowActionState } from '../rules.js';
4
+ import { type CommentsTranslator } from '../messages.en.js';
5
+ /** Headless cursor accumulation and per-row actions; page one remains owned by fetch-query.
6
+ * Permissions are affordances, denied by default. Every server write must reauthorize.
7
+ * @param required The core API and current session grants.
8
+ * @param optional Translator and an invalidation callback for every cached status.
9
+ * @returns An instance-scoped store and actions; dispose makes pending settlements inert.
10
+ */
11
+ export declare function createCommentQueueController({ api, permissions }: {
12
+ api: AdminCommentsPort;
13
+ permissions?: readonly string[];
14
+ }, { t, onInvalidate }?: {
15
+ t?: CommentsTranslator;
16
+ onInvalidate?: () => void;
17
+ }): {
18
+ getSnapshot: () => Readonly<CommentQueueState>;
19
+ subscribe: ({ listener }: {
20
+ listener: () => void;
21
+ }) => () => void;
22
+ dispose: (_required?: Record<string, never>, _optional?: Record<string, never>) => void;
23
+ stateFor: ({ id }: {
24
+ id: string;
25
+ }, _optional?: Record<string, never>) => RowActionState;
26
+ configure: ({ permissions: nextPermissions, t: nextTranslator }: {
27
+ permissions: readonly string[];
28
+ t: CommentsTranslator;
29
+ }, _optional?: Record<string, never>) => void;
30
+ setStatus: ({ status }: {
31
+ status: CommentStatus;
32
+ }, _optional?: Record<string, never>) => void;
33
+ settleFirstPage: ({ page, error, status }: {
34
+ page: AdminCommentsQueuePage | null;
35
+ error: Error | null;
36
+ status: CommentStatus;
37
+ }, _optional?: Record<string, never>) => void;
38
+ loadMore: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
39
+ onModerate: ({ comment, action }: {
40
+ comment: AdminComment;
41
+ action: CommentModerationAction;
42
+ }, _optional?: Record<string, never>) => Promise<void>;
43
+ setPendingPurge: ({ comment }: {
44
+ comment: AdminComment | null;
45
+ }, _optional?: Record<string, never>) => void;
46
+ onPurge: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
47
+ };
48
+ //# sourceMappingURL=comment-queue.controller.d.ts.map