@jini-ai/admin 0.3.10 → 0.4.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 (387) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +71 -37
  3. package/dist/agent-plugins/adapters/http.d.ts +7 -0
  4. package/dist/agent-plugins/adapters/http.js +15 -0
  5. package/dist/agent-plugins/adapters/memory.d.ts +8 -0
  6. package/dist/agent-plugins/adapters/memory.js +25 -0
  7. package/dist/agent-plugins/agent-plugins.module.d.ts +51 -0
  8. package/dist/agent-plugins/agent-plugins.module.js +6 -0
  9. package/dist/agent-plugins/conformance/agent-plugins-api.conformance.d.ts +12 -0
  10. package/dist/agent-plugins/conformance/agent-plugins-api.conformance.js +47 -0
  11. package/dist/agent-plugins/controllers/agent-plugin-files.controller.d.ts +20 -0
  12. package/dist/agent-plugins/controllers/agent-plugin-files.controller.js +43 -0
  13. package/dist/agent-plugins/controllers/agent-plugins.controller.d.ts +25 -0
  14. package/dist/agent-plugins/controllers/agent-plugins.controller.js +91 -0
  15. package/dist/agent-plugins/index.d.ts +9 -0
  16. package/dist/agent-plugins/index.js +9 -0
  17. package/dist/agent-plugins/messages.en.d.ts +23 -0
  18. package/dist/agent-plugins/messages.en.js +14 -0
  19. package/dist/agent-plugins/models.d.ts +57 -0
  20. package/dist/agent-plugins/models.js +2 -0
  21. package/dist/agent-plugins/package-file-tree.d.ts +111 -0
  22. package/dist/agent-plugins/package-file-tree.js +188 -0
  23. package/dist/agent-plugins/ports.d.ts +18 -0
  24. package/dist/agent-plugins/ports.js +3 -0
  25. package/dist/agent-plugins/react/components/AgentPluginFileContent.d.ts +5 -0
  26. package/dist/agent-plugins/react/components/AgentPluginFileContent.js +9 -0
  27. package/dist/agent-plugins/react/components/AgentPluginFileTree.d.ts +9 -0
  28. package/dist/agent-plugins/react/components/AgentPluginFileTree.js +7 -0
  29. package/dist/agent-plugins/react/components/AgentPluginInspector.d.ts +3 -0
  30. package/dist/agent-plugins/react/components/AgentPluginInspector.js +11 -0
  31. package/dist/agent-plugins/react/components/AgentPluginListPanel.d.ts +6 -0
  32. package/dist/agent-plugins/react/components/AgentPluginListPanel.js +10 -0
  33. package/dist/agent-plugins/react/components/AgentPluginRow.d.ts +5 -0
  34. package/dist/agent-plugins/react/components/AgentPluginRow.js +8 -0
  35. package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.d.ts +90 -0
  36. package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.js +74 -0
  37. package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.d.ts +67 -0
  38. package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.js +50 -0
  39. package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.d.ts +55 -0
  40. package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.js +6 -0
  41. package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.d.ts +64 -0
  42. package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.js +39 -0
  43. package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.d.ts +7 -0
  44. package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.js +10 -0
  45. package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.d.ts +6 -0
  46. package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.js +3 -0
  47. package/dist/agent-plugins/react/index.d.ts +245 -0
  48. package/dist/agent-plugins/react/index.js +13 -0
  49. package/dist/agent-plugins/react/pages/AgentPluginsPage.d.ts +4 -0
  50. package/dist/agent-plugins/react/pages/AgentPluginsPage.js +12 -0
  51. package/dist/agent-plugins/react/tabs/DownloadedTab.d.ts +4 -0
  52. package/dist/agent-plugins/react/tabs/DownloadedTab.js +5 -0
  53. package/dist/agent-plugins/react/tabs/InstalledTab.d.ts +4 -0
  54. package/dist/agent-plugins/react/tabs/InstalledTab.js +5 -0
  55. package/dist/agent-plugins/react/tabs/MarketplaceTab.d.ts +4 -0
  56. package/dist/agent-plugins/react/tabs/MarketplaceTab.js +10 -0
  57. package/dist/agent-plugins/rules.d.ts +33 -0
  58. package/dist/agent-plugins/rules.js +51 -0
  59. package/dist/browser/index.d.ts +1 -0
  60. package/dist/browser/index.js +1 -0
  61. package/dist/browser/navigation.d.ts +19 -4
  62. package/dist/browser/navigation.js +8 -8
  63. package/dist/browser/shell-navigation.d.ts +12 -0
  64. package/dist/browser/shell-navigation.js +16 -0
  65. package/dist/contracts/credential-management.d.ts +8 -0
  66. package/dist/contracts/credential-management.js +3 -0
  67. package/dist/contracts/media-picker.d.ts +17 -0
  68. package/dist/contracts/media-picker.js +5 -0
  69. package/dist/contracts/playground-render-target.d.ts +18 -0
  70. package/dist/contracts/playground-render-target.js +3 -0
  71. package/dist/core/entities/rules.d.ts +138 -0
  72. package/dist/core/entities/rules.js +344 -0
  73. package/dist/core/gated/types.d.ts +8 -4
  74. package/dist/core/index.d.ts +4 -0
  75. package/dist/core/index.js +1 -0
  76. package/dist/core/manifest/rules.d.ts +24 -6
  77. package/dist/core/manifest/rules.js +12 -11
  78. package/dist/core/module/controller-store.d.ts +22 -0
  79. package/dist/core/module/controller-store.js +32 -0
  80. package/dist/core/module/create-admin.d.ts +41 -0
  81. package/dist/core/module/create-admin.js +187 -0
  82. package/dist/core/module/define-admin-module.d.ts +4 -0
  83. package/dist/core/module/define-admin-module.js +5 -0
  84. package/dist/core/module/index.d.ts +7 -0
  85. package/dist/core/module/index.js +4 -0
  86. package/dist/core/module/token.d.ts +19 -0
  87. package/dist/core/module/token.js +4 -0
  88. package/dist/core/module/types.d.ts +79 -0
  89. package/dist/core/module/types.js +2 -0
  90. package/dist/core/permissions/rules.d.ts +4 -1
  91. package/dist/core/permissions/rules.js +1 -1
  92. package/dist/core/ports/analytics.d.ts +1 -1
  93. package/dist/core/ports/auth.d.ts +2 -2
  94. package/dist/core/ports/comments.d.ts +9 -6
  95. package/dist/core/ports/database.d.ts +13 -10
  96. package/dist/core/ports/entities.d.ts +302 -0
  97. package/dist/core/ports/entities.js +47 -0
  98. package/dist/core/ports/forms.d.ts +19 -7
  99. package/dist/core/ports/identity.d.ts +42 -17
  100. package/dist/core/ports/index.d.ts +2 -0
  101. package/dist/core/ports/integrations.d.ts +9 -4
  102. package/dist/core/ports/media.d.ts +16 -7
  103. package/dist/core/ports/members.d.ts +7 -3
  104. package/dist/core/ports/menus.d.ts +46 -0
  105. package/dist/core/ports/menus.js +43 -0
  106. package/dist/core/ports/plugins.d.ts +3 -2
  107. package/dist/core/ports/recovery.d.ts +10 -6
  108. package/dist/core/ports/redirects.d.ts +17 -7
  109. package/dist/core/ports/seo.d.ts +12 -6
  110. package/dist/core/ports/shell.d.ts +41 -0
  111. package/dist/core/ports/shell.js +2 -0
  112. package/dist/core/ports/workspace.d.ts +3 -3
  113. package/dist/core/routing/rules.d.ts +17 -4
  114. package/dist/core/routing/rules.js +4 -4
  115. package/dist/core/transport/errors.d.ts +13 -4
  116. package/dist/core/transport/errors.js +4 -4
  117. package/dist/core/transport/http.d.ts +26 -16
  118. package/dist/core/transport/http.js +59 -21
  119. package/dist/core/transport/types.d.ts +26 -14
  120. package/dist/core/transport/types.js +9 -7
  121. package/dist/media/adapters/http.d.ts +27 -0
  122. package/dist/media/adapters/http.js +44 -0
  123. package/dist/media/adapters/memory.d.ts +11 -0
  124. package/dist/media/adapters/memory.js +139 -0
  125. package/dist/media/conformance/media-api.conformance.d.ts +7 -0
  126. package/dist/media/conformance/media-api.conformance.js +69 -0
  127. package/dist/media/controllers/edit-media.controller.d.ts +24 -0
  128. package/dist/media/controllers/edit-media.controller.js +69 -0
  129. package/dist/media/controllers/library.controller.d.ts +47 -0
  130. package/dist/media/controllers/library.controller.js +173 -0
  131. package/dist/media/controllers/providers.controller.d.ts +30 -0
  132. package/dist/media/controllers/providers.controller.js +76 -0
  133. package/dist/media/html-attributes.d.ts +82 -0
  134. package/dist/media/html-attributes.js +204 -0
  135. package/dist/media/index.d.ts +12 -0
  136. package/dist/media/index.js +9 -0
  137. package/dist/media/media.module.d.ts +83 -0
  138. package/dist/media/media.module.js +43 -0
  139. package/dist/media/messages.en.d.ts +24 -0
  140. package/dist/media/messages.en.js +24 -0
  141. package/dist/media/models.d.ts +72 -0
  142. package/dist/media/models.js +2 -0
  143. package/dist/media/ports.d.ts +75 -0
  144. package/dist/media/ports.js +7 -0
  145. package/dist/media/react/components/EditMediaPanel.d.ts +3 -0
  146. package/dist/media/react/components/EditMediaPanel.js +10 -0
  147. package/dist/media/react/components/MediaCard.d.ts +5 -0
  148. package/dist/media/react/components/MediaCard.js +17 -0
  149. package/dist/media/react/components/MediaDialog.d.ts +3 -0
  150. package/dist/media/react/components/MediaDialog.js +8 -0
  151. package/dist/media/react/components/MediaGrid.d.ts +4 -0
  152. package/dist/media/react/components/MediaGrid.js +8 -0
  153. package/dist/media/react/components/MediaIcons.d.ts +14 -0
  154. package/dist/media/react/components/MediaIcons.js +39 -0
  155. package/dist/media/react/components/MediaLightbox.d.ts +5 -0
  156. package/dist/media/react/components/MediaLightbox.js +12 -0
  157. package/dist/media/react/components/MediaPicker.d.ts +3 -0
  158. package/dist/media/react/components/MediaPicker.js +10 -0
  159. package/dist/media/react/components/MediaPurgeDialog.d.ts +4 -0
  160. package/dist/media/react/components/MediaPurgeDialog.js +9 -0
  161. package/dist/media/react/components/UploadButton.d.ts +3 -0
  162. package/dist/media/react/components/UploadButton.js +8 -0
  163. package/dist/media/react/hooks/EditMediaPanel.hooks.d.ts +84 -0
  164. package/dist/media/react/hooks/EditMediaPanel.hooks.js +105 -0
  165. package/dist/media/react/hooks/LibraryTab.hooks.d.ts +103 -0
  166. package/dist/media/react/hooks/LibraryTab.hooks.js +164 -0
  167. package/dist/media/react/hooks/MediaCard.hooks.d.ts +83 -0
  168. package/dist/media/react/hooks/MediaCard.hooks.js +66 -0
  169. package/dist/media/react/hooks/MediaDialog.hooks.d.ts +10 -0
  170. package/dist/media/react/hooks/MediaDialog.hooks.js +20 -0
  171. package/dist/media/react/hooks/MediaGrid.hooks.d.ts +29 -0
  172. package/dist/media/react/hooks/MediaGrid.hooks.js +6 -0
  173. package/dist/media/react/hooks/MediaLightbox.hooks.d.ts +27 -0
  174. package/dist/media/react/hooks/MediaLightbox.hooks.js +64 -0
  175. package/dist/media/react/hooks/MediaPage.hooks.d.ts +68 -0
  176. package/dist/media/react/hooks/MediaPage.hooks.js +68 -0
  177. package/dist/media/react/hooks/MediaPicker.hooks.d.ts +26 -0
  178. package/dist/media/react/hooks/MediaPicker.hooks.js +25 -0
  179. package/dist/media/react/hooks/MediaPorts.hooks.d.ts +9 -0
  180. package/dist/media/react/hooks/MediaPorts.hooks.js +10 -0
  181. package/dist/media/react/hooks/MediaPurgeDialog.hooks.d.ts +22 -0
  182. package/dist/media/react/hooks/MediaPurgeDialog.hooks.js +6 -0
  183. package/dist/media/react/hooks/ProvidersTab.hooks.d.ts +55 -0
  184. package/dist/media/react/hooks/ProvidersTab.hooks.js +124 -0
  185. package/dist/media/react/hooks/UploadButton.hooks.d.ts +48 -0
  186. package/dist/media/react/hooks/UploadButton.hooks.js +118 -0
  187. package/dist/media/react/index.d.ts +373 -0
  188. package/dist/media/react/index.js +73 -0
  189. package/dist/media/react/pages/MediaPage.d.ts +4 -0
  190. package/dist/media/react/pages/MediaPage.js +9 -0
  191. package/dist/media/react/tabs/LibraryTab.d.ts +4 -0
  192. package/dist/media/react/tabs/LibraryTab.js +14 -0
  193. package/dist/media/react/tabs/ProvidersTab.d.ts +4 -0
  194. package/dist/media/react/tabs/ProvidersTab.js +10 -0
  195. package/dist/media/rules.d.ts +86 -0
  196. package/dist/media/rules.js +134 -0
  197. package/dist/media/styles.d.ts +4 -0
  198. package/dist/media/styles.js +5 -0
  199. package/dist/playground/adapters/http.d.ts +8 -0
  200. package/dist/playground/adapters/http.js +4 -0
  201. package/dist/playground/adapters/memory.d.ts +10 -0
  202. package/dist/playground/adapters/memory.js +30 -0
  203. package/dist/playground/conformance/playground-api.conformance.d.ts +6 -0
  204. package/dist/playground/conformance/playground-api.conformance.js +37 -0
  205. package/dist/playground/controllers/playground.controller.d.ts +16 -0
  206. package/dist/playground/controllers/playground.controller.js +21 -0
  207. package/dist/playground/index.d.ts +7 -0
  208. package/dist/playground/index.js +5 -0
  209. package/dist/playground/messages.en.d.ts +9 -0
  210. package/dist/playground/messages.en.js +2 -0
  211. package/dist/playground/models.d.ts +4 -0
  212. package/dist/playground/models.js +2 -0
  213. package/dist/playground/playground.module.d.ts +31 -0
  214. package/dist/playground/playground.module.js +5 -0
  215. package/dist/playground/ports.d.ts +5 -0
  216. package/dist/playground/ports.js +2 -0
  217. package/dist/playground/react/components/Canvas.d.ts +3 -0
  218. package/dist/playground/react/components/Canvas.js +9 -0
  219. package/dist/playground/react/hooks/Canvas.hooks.d.ts +7 -0
  220. package/dist/playground/react/hooks/Canvas.hooks.js +18 -0
  221. package/dist/playground/react/hooks/PlaygroundPage.hooks.d.ts +8 -0
  222. package/dist/playground/react/hooks/PlaygroundPage.hooks.js +2 -0
  223. package/dist/playground/react/hooks/PlaygroundPorts.hooks.d.ts +4 -0
  224. package/dist/playground/react/hooks/PlaygroundPorts.hooks.js +6 -0
  225. package/dist/playground/react/index.d.ts +136 -0
  226. package/dist/playground/react/index.js +10 -0
  227. package/dist/playground/react/pages/PlaygroundPage.d.ts +4 -0
  228. package/dist/playground/react/pages/PlaygroundPage.js +11 -0
  229. package/dist/playground/react/tabs/CanvasTab.d.ts +4 -0
  230. package/dist/playground/react/tabs/CanvasTab.js +5 -0
  231. package/dist/playground/rules.d.ts +4 -0
  232. package/dist/playground/rules.js +2 -0
  233. package/dist/react/OverlayHost.d.ts +3 -0
  234. package/dist/react/OverlayHost.hooks.d.ts +9 -0
  235. package/dist/react/OverlayHost.hooks.js +9 -0
  236. package/dist/react/OverlayHost.js +7 -0
  237. package/dist/react/bind-react.d.ts +46 -0
  238. package/dist/react/bind-react.js +28 -0
  239. package/dist/react/components/ConfirmButton/ConfirmButton.hooks.d.ts +7 -1
  240. package/dist/react/components/ConfirmButton/ConfirmButton.hooks.js +2 -2
  241. package/dist/react/components/ConfirmButton/ConfirmButton.js +1 -1
  242. package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.d.ts +17 -3
  243. package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.js +3 -3
  244. package/dist/react/components/ConfirmDialog/ConfirmDialog.js +5 -5
  245. package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.d.ts +6 -2
  246. package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.js +7 -8
  247. package/dist/react/components/RowMenu/RowMenu.d.ts +5 -1
  248. package/dist/react/components/RowMenu/RowMenu.hooks.d.ts +8 -2
  249. package/dist/react/components/RowMenu/RowMenu.hooks.js +4 -4
  250. package/dist/react/components/RowMenu/RowMenu.js +6 -6
  251. package/dist/react/components/Sidebar.d.ts +1 -1
  252. package/dist/react/components/Sidebar.js +103 -7
  253. package/dist/react/entities/EntityCell.d.ts +10 -0
  254. package/dist/react/entities/EntityCell.js +18 -0
  255. package/dist/react/entities/EntityDetail.d.ts +3 -0
  256. package/dist/react/entities/EntityDetail.js +21 -0
  257. package/dist/react/entities/EntityEdit.d.ts +13 -0
  258. package/dist/react/entities/EntityEdit.js +45 -0
  259. package/dist/react/entities/EntityField.d.ts +20 -0
  260. package/dist/react/entities/EntityField.js +31 -0
  261. package/dist/react/entities/EntityIndex.d.ts +3 -0
  262. package/dist/react/entities/EntityIndex.js +10 -0
  263. package/dist/react/entities/EntityList.d.ts +7 -0
  264. package/dist/react/entities/EntityList.js +52 -0
  265. package/dist/react/entities/contribution.d.ts +26 -0
  266. package/dist/react/entities/contribution.js +78 -0
  267. package/dist/react/entities/index.d.ts +10 -0
  268. package/dist/react/entities/index.js +7 -0
  269. package/dist/react/entities/rules.d.ts +179 -0
  270. package/dist/react/entities/rules.js +224 -0
  271. package/dist/react/entities/types.d.ts +45 -0
  272. package/dist/react/entities/types.js +5 -0
  273. package/dist/react/entities/use-entity-edit.d.ts +35 -0
  274. package/dist/react/entities/use-entity-edit.js +98 -0
  275. package/dist/react/entities/use-entity-read.d.ts +22 -0
  276. package/dist/react/entities/use-entity-read.js +27 -0
  277. package/dist/react/hooks/use-nav-sections.d.ts +12 -3
  278. package/dist/react/hooks/use-nav-sections.js +14 -14
  279. package/dist/react/hooks/use-sidebar-rail.d.ts +7 -1
  280. package/dist/react/hooks/use-sidebar-rail.js +11 -11
  281. package/dist/react/index.d.ts +3 -1
  282. package/dist/react/index.js +5 -2
  283. package/dist/react/overlays.d.ts +38 -0
  284. package/dist/react/overlays.js +46 -0
  285. package/dist/react/shell/AdminShell.d.ts +9 -0
  286. package/dist/react/shell/AdminShell.hooks.d.ts +15 -0
  287. package/dist/react/shell/AdminShell.hooks.js +27 -0
  288. package/dist/react/shell/AdminShell.js +46 -0
  289. package/dist/react/shell/index.d.ts +7 -0
  290. package/dist/react/shell/index.js +5 -0
  291. package/dist/react/shell/model.d.ts +25 -0
  292. package/dist/react/shell/model.js +29 -0
  293. package/dist/react/shell/theme-ports.d.ts +28 -0
  294. package/dist/react/shell/theme-ports.js +2 -0
  295. package/dist/react/shell/types.d.ts +99 -0
  296. package/dist/react/shell/types.js +2 -0
  297. package/dist/react/shell/use-admin-shell-session.d.ts +13 -0
  298. package/dist/react/shell/use-admin-shell-session.js +81 -0
  299. package/dist/react/shell/use-admin-theme.d.ts +16 -0
  300. package/dist/react/shell/use-admin-theme.js +57 -0
  301. package/dist/react/types.d.ts +6 -4
  302. package/dist/react/types.js +2 -2
  303. package/dist/react/use-controller.d.ts +16 -0
  304. package/dist/react/use-controller.js +18 -0
  305. package/dist/security/adapters/http.d.ts +16 -0
  306. package/dist/security/adapters/http.js +94 -0
  307. package/dist/security/adapters/memory.d.ts +15 -0
  308. package/dist/security/adapters/memory.js +60 -0
  309. package/dist/security/conformance/security-api.conformance.d.ts +10 -0
  310. package/dist/security/conformance/security-api.conformance.js +48 -0
  311. package/dist/security/controllers/access-tokens.controller.d.ts +44 -0
  312. package/dist/security/controllers/access-tokens.controller.js +112 -0
  313. package/dist/security/controllers/other-credentials.controller.d.ts +30 -0
  314. package/dist/security/controllers/other-credentials.controller.js +74 -0
  315. package/dist/security/controllers/root-key.controller.d.ts +35 -0
  316. package/dist/security/controllers/root-key.controller.js +90 -0
  317. package/dist/security/index.d.ts +9 -0
  318. package/dist/security/index.js +9 -0
  319. package/dist/security/messages.en.d.ts +12 -0
  320. package/dist/security/messages.en.js +2 -0
  321. package/dist/security/models.d.ts +112 -0
  322. package/dist/security/models.js +2 -0
  323. package/dist/security/ports.d.ts +58 -0
  324. package/dist/security/ports.js +5 -0
  325. package/dist/security/react/components/CredentialEditor.d.ts +3 -0
  326. package/dist/security/react/components/CredentialEditor.js +8 -0
  327. package/dist/security/react/hooks/AccessTokensTab.hooks.d.ts +94 -0
  328. package/dist/security/react/hooks/AccessTokensTab.hooks.js +36 -0
  329. package/dist/security/react/hooks/CredentialEditor.hooks.d.ts +49 -0
  330. package/dist/security/react/hooks/CredentialEditor.hooks.js +14 -0
  331. package/dist/security/react/hooks/RootKeyTab.hooks.d.ts +29 -0
  332. package/dist/security/react/hooks/RootKeyTab.hooks.js +19 -0
  333. package/dist/security/react/hooks/SecurityPage.hooks.d.ts +17 -0
  334. package/dist/security/react/hooks/SecurityPage.hooks.js +12 -0
  335. package/dist/security/react/hooks/SecurityPorts.hooks.d.ts +9 -0
  336. package/dist/security/react/hooks/SecurityPorts.hooks.js +6 -0
  337. package/dist/security/react/index.d.ts +215 -0
  338. package/dist/security/react/index.js +10 -0
  339. package/dist/security/react/pages/SecurityPage.d.ts +4 -0
  340. package/dist/security/react/pages/SecurityPage.js +10 -0
  341. package/dist/security/react/tabs/AccessTokensTab.d.ts +4 -0
  342. package/dist/security/react/tabs/AccessTokensTab.js +10 -0
  343. package/dist/security/react/tabs/RootKeyTab.d.ts +4 -0
  344. package/dist/security/react/tabs/RootKeyTab.js +9 -0
  345. package/dist/security/rules.d.ts +57 -0
  346. package/dist/security/rules.js +63 -0
  347. package/dist/security/security.module.d.ts +45 -0
  348. package/dist/security/security.module.js +5 -0
  349. package/dist/source-control/adapters/http.d.ts +6 -0
  350. package/dist/source-control/adapters/http.js +13 -0
  351. package/dist/source-control/adapters/memory.d.ts +9 -0
  352. package/dist/source-control/adapters/memory.js +35 -0
  353. package/dist/source-control/conformance/source-control-api.conformance.d.ts +10 -0
  354. package/dist/source-control/conformance/source-control-api.conformance.js +48 -0
  355. package/dist/source-control/controllers/source-control.controller.d.ts +26 -0
  356. package/dist/source-control/controllers/source-control.controller.js +70 -0
  357. package/dist/source-control/index.d.ts +8 -0
  358. package/dist/source-control/index.js +6 -0
  359. package/dist/source-control/messages.en.d.ts +11 -0
  360. package/dist/source-control/messages.en.js +2 -0
  361. package/dist/source-control/models.d.ts +70 -0
  362. package/dist/source-control/models.js +2 -0
  363. package/dist/source-control/ports.d.ts +23 -0
  364. package/dist/source-control/ports.js +3 -0
  365. package/dist/source-control/react/components/SourceControlCredentialFields.d.ts +5 -0
  366. package/dist/source-control/react/components/SourceControlCredentialFields.js +8 -0
  367. package/dist/source-control/react/components/SourceControlProviderRow.d.ts +5 -0
  368. package/dist/source-control/react/components/SourceControlProviderRow.js +7 -0
  369. package/dist/source-control/react/hooks/ProvidersTab.hooks.d.ts +45 -0
  370. package/dist/source-control/react/hooks/ProvidersTab.hooks.js +20 -0
  371. package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.d.ts +43 -0
  372. package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.js +9 -0
  373. package/dist/source-control/react/hooks/SourceControlPage.hooks.d.ts +17 -0
  374. package/dist/source-control/react/hooks/SourceControlPage.hooks.js +5 -0
  375. package/dist/source-control/react/hooks/SourceControlPorts.hooks.d.ts +9 -0
  376. package/dist/source-control/react/hooks/SourceControlPorts.hooks.js +6 -0
  377. package/dist/source-control/react/index.d.ts +156 -0
  378. package/dist/source-control/react/index.js +10 -0
  379. package/dist/source-control/react/pages/SourceControlPage.d.ts +4 -0
  380. package/dist/source-control/react/pages/SourceControlPage.js +11 -0
  381. package/dist/source-control/react/tabs/ProvidersTab.d.ts +4 -0
  382. package/dist/source-control/react/tabs/ProvidersTab.js +10 -0
  383. package/dist/source-control/rules.d.ts +32 -0
  384. package/dist/source-control/rules.js +35 -0
  385. package/dist/source-control/source-control.module.d.ts +36 -0
  386. package/dist/source-control/source-control.module.js +6 -0
  387. package/package.json +207 -4
@@ -43,9 +43,9 @@ export const DEFAULT_NAV_SECTIONS_STORAGE_KEY = 'jini-admin-nav-sections';
43
43
  * Non-boolean entries are dropped individually rather than rejecting the whole map, so one bad key
44
44
  * cannot discard a user's other sections.
45
45
  */
46
- function readPersisted(storageKey) {
46
+ function readPersisted(storageKey, storage) {
47
47
  try {
48
- const raw = localStorage.getItem(storageKey);
48
+ const raw = storage.getItem(storageKey);
49
49
  if (raw === null)
50
50
  return {};
51
51
  const parsed = JSON.parse(raw);
@@ -62,9 +62,9 @@ function readPersisted(storageKey) {
62
62
  return {};
63
63
  }
64
64
  }
65
- function writePersisted(storageKey, state) {
65
+ function writePersisted(storageKey, state, storage) {
66
66
  try {
67
- localStorage.setItem(storageKey, JSON.stringify(state));
67
+ storage.setItem(storageKey, JSON.stringify(state));
68
68
  }
69
69
  catch {
70
70
  // Best-effort, exactly as in `use-sidebar-rail.ts`: a user who cannot persist still gets a
@@ -81,19 +81,19 @@ function writePersisted(storageKey, state) {
81
81
  * handful, fixed by the host's panel manifest, never user-variable.
82
82
  * @overallScore 100
83
83
  */
84
- export function useNavSections(storageKey = DEFAULT_NAV_SECTIONS_STORAGE_KEY) {
85
- const [state, setState] = useState(() => readPersisted(storageKey));
86
- const isOpen = useCallback((groupLabel) => state[groupLabel] ?? true, [state]);
87
- const toggle = useCallback((groupLabel) => {
84
+ export function useNavSections({ storage, events }, { storageKey = DEFAULT_NAV_SECTIONS_STORAGE_KEY } = {}) {
85
+ const [state, setState] = useState(() => readPersisted(storageKey, storage));
86
+ const isOpen = useCallback(({ groupLabel }) => state[groupLabel] ?? true, [state]);
87
+ const toggle = useCallback(({ groupLabel }) => {
88
88
  setState((current) => {
89
89
  // `?? true` here and in `isOpen` must agree: toggling a section that has never been stored
90
90
  // has to close it (it is currently rendered open), not open an already-open section — which
91
91
  // is what a bare `!current[label]` would do on the `undefined` first press.
92
92
  const next = { ...current, [groupLabel]: !(current[groupLabel] ?? true) };
93
- writePersisted(storageKey, next);
93
+ writePersisted(storageKey, next, storage);
94
94
  return next;
95
95
  });
96
- }, [storageKey]);
96
+ }, [storageKey, storage]);
97
97
  /** Cross-tab sync — two admin tabs should agree on the layout rather than diverging the moment
98
98
  * either one collapses a section. Mirrors `useSidebarRail`'s listener, including treating a
99
99
  * removed key (`newValue === null`, another tab clearing storage) as "no stored preference"
@@ -102,11 +102,11 @@ export function useNavSections(storageKey = DEFAULT_NAV_SECTIONS_STORAGE_KEY) {
102
102
  function onStorage(event) {
103
103
  if (event.key !== storageKey)
104
104
  return;
105
- setState(event.newValue === null ? {} : readPersisted(storageKey));
105
+ setState(event.newValue === null ? {} : readPersisted(storageKey, storage));
106
106
  }
107
- window.addEventListener('storage', onStorage);
108
- return () => window.removeEventListener('storage', onStorage);
109
- }, [storageKey]);
107
+ events.addEventListener('storage', onStorage);
108
+ return () => events.removeEventListener('storage', onStorage);
109
+ }, [storageKey, storage, events]);
110
110
  return { isOpen, toggle };
111
111
  }
112
112
  //# sourceMappingURL=use-nav-sections.js.map
@@ -35,5 +35,11 @@ export interface SidebarRail {
35
35
  *
36
36
  * @complexity O(1) — one state read/write per toggle, no derived computation.
37
37
  */
38
- export declare function useSidebarRail(storageKey?: string, defaultCollapsed?: boolean): SidebarRail;
38
+ export declare function useSidebarRail({ storage, events }: {
39
+ readonly storage: Pick<Storage, 'getItem' | 'setItem'>;
40
+ readonly events: Pick<Window, 'addEventListener' | 'removeEventListener'>;
41
+ }, { storageKey, defaultCollapsed }?: {
42
+ readonly storageKey?: string | undefined;
43
+ readonly defaultCollapsed?: boolean | undefined;
44
+ }): SidebarRail;
39
45
  //# sourceMappingURL=use-sidebar-rail.d.ts.map
@@ -32,9 +32,9 @@ export const DEFAULT_SIDEBAR_RAIL_STORAGE_KEY = 'jini-admin-sidebar-rail-collaps
32
32
  * it collapsed again on every reload, because their explicit `'0'` would be indistinguishable from
33
33
  * never having chosen. A stored value always wins over the default; only its absence defers.
34
34
  */
35
- function readPersisted(storageKey) {
35
+ function readPersisted(storageKey, storage) {
36
36
  try {
37
- const raw = localStorage.getItem(storageKey);
37
+ const raw = storage.getItem(storageKey);
38
38
  if (raw === null)
39
39
  return undefined;
40
40
  return raw === '1';
@@ -43,9 +43,9 @@ function readPersisted(storageKey) {
43
43
  return undefined;
44
44
  }
45
45
  }
46
- function writePersisted(storageKey, collapsed) {
46
+ function writePersisted(storageKey, collapsed, storage) {
47
47
  try {
48
- localStorage.setItem(storageKey, collapsed ? '1' : '0');
48
+ storage.setItem(storageKey, collapsed ? '1' : '0');
49
49
  }
50
50
  catch {
51
51
  // Best-effort — a user who cannot persist the preference still gets a working toggle for the
@@ -64,15 +64,15 @@ function writePersisted(storageKey, collapsed) {
64
64
  *
65
65
  * @complexity O(1) — one state read/write per toggle, no derived computation.
66
66
  */
67
- export function useSidebarRail(storageKey = DEFAULT_SIDEBAR_RAIL_STORAGE_KEY, defaultCollapsed = false) {
68
- const [collapsed, setCollapsed] = useState(() => readPersisted(storageKey) ?? defaultCollapsed);
67
+ export function useSidebarRail({ storage, events }, { storageKey = DEFAULT_SIDEBAR_RAIL_STORAGE_KEY, defaultCollapsed = false } = {}) {
68
+ const [collapsed, setCollapsed] = useState(() => readPersisted(storageKey, storage) ?? defaultCollapsed);
69
69
  const toggle = useCallback(() => {
70
70
  setCollapsed((current) => {
71
71
  const next = !current;
72
- writePersisted(storageKey, next);
72
+ writePersisted(storageKey, next, storage);
73
73
  return next;
74
74
  });
75
- }, [storageKey]);
75
+ }, [storageKey, storage]);
76
76
  /** Cross-tab sync: two admin tabs open side by side should agree on the rail state rather than
77
77
  * silently diverging the moment either one is toggled. */
78
78
  useEffect(() => {
@@ -85,9 +85,9 @@ export function useSidebarRail(storageKey = DEFAULT_SIDEBAR_RAIL_STORAGE_KEY, de
85
85
  // collapsed-by-default host in every other one.
86
86
  setCollapsed(event.newValue === null ? defaultCollapsed : event.newValue === '1');
87
87
  }
88
- window.addEventListener('storage', onStorage);
89
- return () => window.removeEventListener('storage', onStorage);
90
- }, [storageKey, defaultCollapsed]);
88
+ events.addEventListener('storage', onStorage);
89
+ return () => events.removeEventListener('storage', onStorage);
90
+ }, [storageKey, defaultCollapsed, events]);
91
91
  return { collapsed, toggle };
92
92
  }
93
93
  //# sourceMappingURL=use-sidebar-rail.js.map
@@ -41,7 +41,7 @@ export type { ConfirmDialogController, UseConfirmDialog } from './components/Con
41
41
  export { ConfirmDialogDefaultsProvider } from './components/ConfirmDialog/ConfirmDialog.hooks.js';
42
42
  export type { ConfirmDialogDefaults, ConfirmDialogDefaultsProviderProps, } from './components/ConfirmDialog/ConfirmDialog.hooks.js';
43
43
  export { DataTable } from './components/DataTable.js';
44
- export type { DataTableColumn, DataTableProps } from './components/DataTable.js';
44
+ export type { DataTableColumn, DataTableColumnSort, DataTableProps, DataTableSortDirection, DataTableSortState, } from './components/DataTable.js';
45
45
  export { InteractiveHtmlEditor } from './components/InteractiveHtmlEditor/InteractiveHtmlEditor.js';
46
46
  export type { InteractiveHtmlEditorProps } from './components/InteractiveHtmlEditor/InteractiveHtmlEditor.js';
47
47
  export { RowMenu } from './components/RowMenu/RowMenu.js';
@@ -52,4 +52,6 @@ export { DEFAULT_SIDEBAR_RAIL_STORAGE_KEY, useSidebarRail } from './hooks/use-si
52
52
  export type { SidebarRail } from './hooks/use-sidebar-rail.js';
53
53
  export { DEFAULT_NAV_SECTIONS_STORAGE_KEY, useNavSections } from './hooks/use-nav-sections.js';
54
54
  export type { NavSections, NavSectionState } from './hooks/use-nav-sections.js';
55
+ export * from './shell/index.js';
56
+ export * from './entities/index.js';
55
57
  //# sourceMappingURL=index.d.ts.map
@@ -39,8 +39,9 @@ export { ConfirmDialog } from './components/ConfirmDialog/ConfirmDialog.js';
39
39
  // Host-wide `ConfirmDialog` defaults (today just a translated `cancelLabel`), set once at an app
40
40
  // root rather than passed at every call site — see `ConfirmDialogDefaultsProvider`'s doc comment.
41
41
  export { ConfirmDialogDefaultsProvider } from './components/ConfirmDialog/ConfirmDialog.hooks.js';
42
- // The list table. Deliberately has no sorting, pagination or row selection — see its file header
43
- // for the corpus evidence behind each omission.
42
+ // The list table. Sorting is opt-in per column (`DataTableColumn.sort`); pagination and row
43
+ // selection are still deliberately absent — see its file header for the corpus evidence behind
44
+ // every one of these decisions.
44
45
  export { DataTable } from './components/DataTable.js';
45
46
  // Visual click-into-text editing surface for a bespoke HTML document, built on GrapesJS. See its
46
47
  // own file header for the styling-contract exception it carries (vendor CSS import) and the
@@ -53,4 +54,6 @@ export { RowMenu } from './components/RowMenu/RowMenu.js';
53
54
  export { Sidebar, useSidebar } from './components/Sidebar.js';
54
55
  export { DEFAULT_SIDEBAR_RAIL_STORAGE_KEY, useSidebarRail } from './hooks/use-sidebar-rail.js';
55
56
  export { DEFAULT_NAV_SECTIONS_STORAGE_KEY, useNavSections } from './hooks/use-nav-sections.js';
57
+ export * from './shell/index.js';
58
+ export * from './entities/index.js';
56
59
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,38 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface OverlayEntry {
3
+ readonly id: number;
4
+ readonly render: () => ReactNode;
5
+ }
6
+ export interface OverlayPort {
7
+ open<T>(required: {
8
+ render: (required: {
9
+ resolve: (value: T | null) => void;
10
+ cancel: () => void;
11
+ }) => ReactNode;
12
+ }, optional?: {
13
+ signal?: AbortSignal;
14
+ }): Promise<T | null>;
15
+ }
16
+ /** One active overlay per host. A second request rejects instead of stealing the first
17
+ * caller's promise; abort/dispose settle null and release every event listener. */
18
+ export declare function createOverlayController(_required?: Record<string, never>, _optional?: Record<string, never>): {
19
+ getSnapshot: () => Readonly<{
20
+ entries: readonly OverlayEntry[];
21
+ }>;
22
+ subscribe: ({ listener }: {
23
+ listener: () => void;
24
+ }) => () => void;
25
+ open<T>({ render, }: {
26
+ render: (required: {
27
+ resolve: (value: T | null) => void;
28
+ cancel: () => void;
29
+ }) => ReactNode;
30
+ }, { signal }?: {
31
+ signal?: AbortSignal;
32
+ }): Promise<T | null>;
33
+ cancel(_required?: Record<string, never>, _optional?: Record<string, never>): void;
34
+ dispose(_required?: Record<string, never>, _optional?: Record<string, never>): void;
35
+ };
36
+ export { OverlayHost } from './OverlayHost.js';
37
+ export type { OverlayHostProps } from './OverlayHost.hooks.js';
38
+ //# sourceMappingURL=overlays.d.ts.map
@@ -0,0 +1,46 @@
1
+ import { createControllerStore } from '../core/module/controller-store.js';
2
+ /** One active overlay per host. A second request rejects instead of stealing the first
3
+ * caller's promise; abort/dispose settle null and release every event listener. */
4
+ export function createOverlayController(_required = {}, _optional = {}) {
5
+ const store = createControllerStore({ initial: { entries: [] } });
6
+ let sequence = 0, cancelActive = null;
7
+ return {
8
+ getSnapshot: store.getSnapshot,
9
+ subscribe: store.subscribe,
10
+ open({ render, }, { signal } = {}) {
11
+ if (store.signal.aborted || signal?.aborted)
12
+ return Promise.resolve(null);
13
+ if (cancelActive)
14
+ return Promise.reject(new Error('An overlay is already open'));
15
+ return new Promise((resolve) => {
16
+ let settled = false;
17
+ const finish = (value) => {
18
+ if (settled)
19
+ return;
20
+ settled = true;
21
+ signal?.removeEventListener('abort', cancel);
22
+ cancelActive = null;
23
+ store.set({ patch: { entries: [] } });
24
+ resolve(value);
25
+ };
26
+ const cancel = () => finish(null);
27
+ cancelActive = cancel;
28
+ signal?.addEventListener('abort', cancel, { once: true });
29
+ store.set({
30
+ patch: {
31
+ entries: [{ id: ++sequence, render: () => render({ resolve: finish, cancel }) }],
32
+ },
33
+ });
34
+ });
35
+ },
36
+ cancel(_required = {}, _optional = {}) {
37
+ cancelActive?.();
38
+ },
39
+ dispose(_required = {}, _optional = {}) {
40
+ cancelActive?.();
41
+ store.dispose();
42
+ },
43
+ };
44
+ }
45
+ export { OverlayHost } from './OverlayHost.js';
46
+ //# sourceMappingURL=overlays.js.map
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { AdminShellProps } from './types.js';
3
+ /**
4
+ * A host-composed admin layout with manifest navigation and a session gate.
5
+ * @param props Required host scope, ports, contributions, labels and slots; optional layout settings.
6
+ * @returns Loading/login/error UI or the authenticated sidebar, feature screen and pane slots.
7
+ */
8
+ export declare function AdminShell(props: AdminShellProps): ReactNode;
9
+ //# sourceMappingURL=AdminShell.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { type Dispatch, type SetStateAction } from 'react';
2
+ import type { AdminShellNavigationPort } from './types.js';
3
+ /** Internal shell wiring: a route snapshot and host-installed SPA link interception. */
4
+ export declare function useShellRoute(args: {
5
+ readonly navigation: AdminShellNavigationPort;
6
+ readonly base: string;
7
+ }): string;
8
+ /** Mobile overlay state, independent of the Sidebar's persisted desktop rail state. */
9
+ export declare function useShellDrawer(args: {
10
+ readonly routePath: string;
11
+ }): {
12
+ readonly open: boolean;
13
+ readonly setOpen: Dispatch<SetStateAction<boolean>>;
14
+ };
15
+ //# sourceMappingURL=AdminShell.hooks.d.ts.map
@@ -0,0 +1,27 @@
1
+ import { useCallback, useEffect, useState, useSyncExternalStore } from 'react';
2
+ /** Internal shell wiring: a route snapshot and host-installed SPA link interception. */
3
+ export function useShellRoute(args) {
4
+ const { navigation, base } = args;
5
+ const subscribe = useCallback((onChange) => navigation.subscribe({ base, onChange }), [navigation, base]);
6
+ const read = useCallback(() => navigation.readRoute({ base }), [navigation, base]);
7
+ const routePath = useSyncExternalStore(subscribe, read, read);
8
+ useEffect(() => navigation.installLinkInterceptor({ base }), [navigation, base]);
9
+ return routePath;
10
+ }
11
+ /** Mobile overlay state, independent of the Sidebar's persisted desktop rail state. */
12
+ export function useShellDrawer(args) {
13
+ const [open, setOpen] = useState(false);
14
+ useEffect(() => setOpen(false), [args.routePath]);
15
+ useEffect(() => {
16
+ if (!open)
17
+ return;
18
+ const onKeyDown = (event) => {
19
+ if (event.key === 'Escape')
20
+ setOpen(false);
21
+ };
22
+ document.addEventListener('keydown', onKeyDown);
23
+ return () => document.removeEventListener('keydown', onKeyDown);
24
+ }, [open]);
25
+ return { open, setOpen };
26
+ }
27
+ //# sourceMappingURL=AdminShell.hooks.js.map
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useMemo } from 'react';
3
+ import { Sidebar } from '../components/Sidebar.js';
4
+ import { useShellDrawer, useShellRoute } from './AdminShell.hooks.js';
5
+ import { resolveAdminShellModel } from './model.js';
6
+ import { useAdminShellSession } from './use-admin-shell-session.js';
7
+ import { useAdminTheme } from './use-admin-theme.js';
8
+ /**
9
+ * A host-composed admin layout with manifest navigation and a session gate.
10
+ * @param props Required host scope, ports, contributions, labels and slots; optional layout settings.
11
+ * @returns Loading/login/error UI or the authenticated sidebar, feature screen and pane slots.
12
+ */
13
+ export function AdminShell(props) {
14
+ const context = useMemo(() => ({ apiBase: props.apiBase, workspace: props.workspace }), [props.apiBase, props.workspace]);
15
+ const session = useAdminShellSession({ port: props.session, context });
16
+ const appearance = useAdminTheme({ userId: session.state.status === 'authenticated' ? session.state.session.user.id : null, workspace: context.workspace }, {
17
+ ...(props.theme ? { theme: props.theme } : {}),
18
+ ...(props.colorScheme ? { colorScheme: props.colorScheme } : {}),
19
+ ...(props.themeEnvironment ? { environment: props.themeEnvironment } : {}),
20
+ ...(props.themePreferenceStore ? { preferenceStore: props.themePreferenceStore } : {}),
21
+ ...(props.onColorSchemeChange ? { onColorSchemeChange: props.onColorSchemeChange } : {}),
22
+ });
23
+ const routePath = useShellRoute({ navigation: props.navigation, base: props.adminBase });
24
+ const drawer = useShellDrawer({ routePath });
25
+ const id = useId();
26
+ const sidebarId = `${id}-sidebar`;
27
+ const mainId = `${id}-main`;
28
+ if (session.state.status === 'checking')
29
+ return _jsx("div", { className: "boot-screen", role: "status", children: props.labels.loading });
30
+ if (session.state.status === 'anonymous')
31
+ return props.slots.login({ context, refreshSession: session.refresh });
32
+ if (session.state.status === 'error') {
33
+ if (props.slots.sessionError)
34
+ return props.slots.sessionError({ error: session.state.error, retry: session.refresh });
35
+ return _jsxs("div", { role: "alert", children: [_jsx("p", { children: props.labels.sessionError }), _jsx("button", { type: "button", onClick: () => { void session.refresh(); }, children: props.labels.retry })] });
36
+ }
37
+ const model = resolveAdminShellModel({ panels: props.panels, session: session.state.session, routePath, defaultPanelId: props.defaultPanelId }, { capabilities: props.capabilities ?? [] });
38
+ const slotArgs = {
39
+ context, session: session.state.session, route: model.route, logout: session.logout, refreshSession: session.refresh,
40
+ ...(appearance ? { appearance } : {}),
41
+ };
42
+ const nav = props.translateNav ? props.translateNav({ groups: model.nav }) : model.nav;
43
+ const assistant = props.slots.assistant;
44
+ return (_jsxs("div", { className: ['admin-layout', props.className].filter(Boolean).join(' '), children: [_jsx("a", { href: `#${mainId}`, className: "skip-link", children: props.labels.skipToContent }), _jsxs(Sidebar, { activeId: model.route.panelId ?? '', base: props.adminBase, open: drawer.open, id: sidebarId, label: props.labels.navigation, railStorageKey: props.railStorageKey, railDefaultCollapsed: props.railDefaultCollapsed ?? false, children: [props.slots.sidebarHeader, _jsx(Sidebar.Nav, { groups: nav, soonLabel: props.labels.soon, collapsibleGroups: props.collapsibleGroups ?? [] }), _jsxs(Sidebar.Footer, { children: [_jsx(Sidebar.RailToggle, { expandLabel: props.labels.expandSidebar, collapseLabel: props.labels.collapseSidebar }), props.slots.sidebarFooter?.(slotArgs)] })] }), drawer.open && _jsx("button", { type: "button", className: "sidebar-backdrop", "aria-label": props.labels.closeNavigation, onClick: () => drawer.setOpen(false) }), _jsxs("div", { className: "admin-main-col", children: [_jsxs("div", { className: "admin-topbar", children: [_jsx("button", { type: "button", className: "admin-topbar-toggle", "aria-expanded": drawer.open, "aria-controls": sidebarId, "aria-label": drawer.open ? props.labels.closeNavigation : props.labels.openNavigation, onClick: () => drawer.setOpen((open) => !open), children: _jsx("svg", { viewBox: "0 0 18 18", fill: "none", stroke: "currentColor", strokeWidth: 1.5, "aria-hidden": "true", children: _jsx("path", { d: "M2.5 5h13M2.5 9h13M2.5 13h13" }) }) }), _jsx("span", { className: "admin-topbar-title", children: props.title }), props.slots.topbar] }), _jsx("main", { ref: props.mainRef, id: mainId, className: "admin-content", tabIndex: -1, "data-agent-page": model.agentPageId ?? undefined, children: model.panel?.render(slotArgs) })] }), assistant && _jsx("aside", { className: "admin-assistant-pane", "aria-label": assistant.label, hidden: !assistant.open, children: assistant.content }), props.slots.overlays?.(slotArgs)] }));
45
+ }
46
+ //# sourceMappingURL=AdminShell.js.map
@@ -0,0 +1,7 @@
1
+ export { AdminShell } from './AdminShell.js';
2
+ export { resolveAdminShellModel, type AdminShellModel } from './model.js';
3
+ export { useAdminShellSession } from './use-admin-shell-session.js';
4
+ export type { AdminShellContext, AdminShellLabels, AdminShellNavigationPort, AdminShellPanel, AdminShellProps, AdminShellRenderArgs, AdminShellSession, AdminShellSessionController, AdminShellSessionPort, AdminShellSessionState, AdminShellSlotArgs, AdminShellSlots, } from './types.js';
5
+ export type { AdminThemePreferenceStorePort, AdminThemeEnvironment, AdminShellAppearance } from './theme-ports.js';
6
+ export { useAdminTheme } from './use-admin-theme.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { AdminShell } from './AdminShell.js';
2
+ export { resolveAdminShellModel } from './model.js';
3
+ export { useAdminShellSession } from './use-admin-shell-session.js';
4
+ export { useAdminTheme } from './use-admin-theme.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,25 @@
1
+ import { type AdminNavGroup } from '../../core/manifest/rules.js';
2
+ import type { AdminRoute } from '../../core/routing/types.js';
3
+ import type { AdminShellPanel, AdminShellSession } from './types.js';
4
+ export interface AdminShellModel {
5
+ readonly panels: readonly AdminShellPanel[];
6
+ readonly panel: AdminShellPanel | undefined;
7
+ readonly route: AdminRoute;
8
+ readonly nav: readonly AdminNavGroup[];
9
+ readonly agentPageId: string | null;
10
+ }
11
+ /**
12
+ * Derive navigation and render dispatch from one resolved manifest.
13
+ * @param args Required host manifest, session, route and fallback panel.
14
+ * @param options Optional wired capability keys.
15
+ * @returns A matched route or a clean default index route. Never mutates contributions.
16
+ */
17
+ export declare function resolveAdminShellModel(args: {
18
+ readonly panels: readonly AdminShellPanel[];
19
+ readonly session: AdminShellSession;
20
+ readonly routePath: string;
21
+ readonly defaultPanelId: string;
22
+ }, options?: {
23
+ readonly capabilities?: readonly string[];
24
+ }): AdminShellModel;
25
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1,29 @@
1
+ import { buildNav, resolveAgentPageId, resolvePanels } from '../../core/manifest/rules.js';
2
+ import { matchRoute } from '../../core/routing/rules.js';
3
+ /**
4
+ * Derive navigation and render dispatch from one resolved manifest.
5
+ * @param args Required host manifest, session, route and fallback panel.
6
+ * @param options Optional wired capability keys.
7
+ * @returns A matched route or a clean default index route. Never mutates contributions.
8
+ */
9
+ export function resolveAdminShellModel(args, options = {}) {
10
+ const panels = resolvePanels({ panels: args.panels }, {
11
+ capabilities: options.capabilities ?? [],
12
+ permissions: args.session.effectivePermissions ?? [],
13
+ });
14
+ const matched = matchRoute({ routePath: args.routePath, panels });
15
+ const rawPath = args.routePath.split('?')[0] ?? '';
16
+ const isRoot = rawPath.split('/').filter(Boolean).length === 0;
17
+ // The existing matcher maps root to dashboard. The shell's default is host-owned.
18
+ const route = isRoot || matched.panelId === null
19
+ ? { panelId: args.defaultPanelId, view: null, params: {}, query: matched.query }
20
+ : matched;
21
+ return {
22
+ panels,
23
+ panel: panels.find((panel) => panel.id === route.panelId),
24
+ route,
25
+ nav: buildNav({ panels }, { defaultPanelId: args.defaultPanelId }),
26
+ agentPageId: resolveAgentPageId({ panels, panelId: route.panelId, view: route.view }),
27
+ };
28
+ }
29
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1,28 @@
1
+ import type { AdminThemeDocument, AdminThemeTarget, ColorScheme, ColorSchemePreference, MatchMediaPort } from '@jini-ai/ui/theme';
2
+ /** The host chooses storage and keys. Preferences are always scoped to a user and workspace. */
3
+ export interface AdminThemePreferenceStorePort {
4
+ read(args: {
5
+ readonly userId: string;
6
+ readonly workspace: Readonly<Record<string, string>>;
7
+ }): ColorSchemePreference | null;
8
+ write(args: {
9
+ readonly userId: string;
10
+ readonly workspace: Readonly<Record<string, string>>;
11
+ readonly preference: ColorSchemePreference;
12
+ }): void;
13
+ }
14
+ /** Inject the same scope for the theme and color scheme; use the document root for portals. */
15
+ export interface AdminThemeEnvironment {
16
+ readonly target: AdminThemeTarget;
17
+ readonly document: AdminThemeDocument;
18
+ readonly matchMedia: MatchMediaPort;
19
+ }
20
+ /** Exposed to slots so the host supplies its own light/dark/system picker and labels. */
21
+ export interface AdminShellAppearance {
22
+ readonly preference: ColorSchemePreference;
23
+ readonly resolved: ColorScheme;
24
+ setPreference(args: {
25
+ readonly preference: ColorSchemePreference;
26
+ }): void;
27
+ }
28
+ //# sourceMappingURL=theme-ports.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=theme-ports.js.map
@@ -0,0 +1,99 @@
1
+ import type { ReactNode, Ref } from 'react';
2
+ import type { AdminTheme, ColorSchemePreference } from '@jini-ai/ui/theme';
3
+ import type { AdminShellAppearance, AdminThemeEnvironment, AdminThemePreferenceStorePort } from './theme-ports.js';
4
+ import type { AdminPanel } from '../../core/manifest/types.js';
5
+ import type { AdminNavGroup } from '../../core/manifest/rules.js';
6
+ import type { AdminRoute } from '../../core/routing/types.js';
7
+ import type { AdminShellContext, AdminShellNavigationPort, AdminShellSession, AdminShellSessionPort } from '../../core/ports/shell.js';
8
+ export type { AdminShellContext, AdminShellNavigationPort, AdminShellSession, AdminShellSessionPort } from '../../core/ports/shell.js';
9
+ export interface AdminShellRenderArgs {
10
+ readonly context: AdminShellContext;
11
+ readonly session: AdminShellSession;
12
+ readonly route: AdminRoute;
13
+ }
14
+ /** A feature contribution uses the existing manifest, with a React renderer taking one object. */
15
+ export type AdminShellPanel = AdminPanel<(args: AdminShellRenderArgs) => ReactNode>;
16
+ export type AdminShellSessionState = {
17
+ readonly status: 'checking';
18
+ } | {
19
+ readonly status: 'anonymous';
20
+ } | {
21
+ readonly status: 'authenticated';
22
+ readonly session: AdminShellSession;
23
+ } | {
24
+ readonly status: 'error';
25
+ readonly error: unknown;
26
+ };
27
+ export interface AdminShellSessionController {
28
+ readonly state: AdminShellSessionState;
29
+ /** Re-read after the host's login UI finishes; also refreshes effective permissions. */
30
+ readonly refresh: () => Promise<void>;
31
+ readonly logout: () => Promise<void>;
32
+ }
33
+ export interface AdminShellSlotArgs extends AdminShellRenderArgs {
34
+ readonly appearance?: AdminShellAppearance;
35
+ readonly logout: () => Promise<void>;
36
+ readonly refreshSession: () => Promise<void>;
37
+ }
38
+ export interface AdminShellSlots {
39
+ readonly login: (args: {
40
+ readonly context: AdminShellContext;
41
+ readonly refreshSession: () => Promise<void>;
42
+ }) => ReactNode;
43
+ readonly sessionError?: (args: {
44
+ readonly error: unknown;
45
+ readonly retry: () => Promise<void>;
46
+ }) => ReactNode;
47
+ readonly sidebarHeader?: ReactNode;
48
+ readonly sidebarFooter?: (args: AdminShellSlotArgs) => ReactNode;
49
+ readonly topbar?: ReactNode;
50
+ readonly overlays?: (args: AdminShellSlotArgs) => ReactNode;
51
+ /** Always mounted while authenticated; hidden when closed. The host owns pane controls. */
52
+ readonly assistant?: {
53
+ readonly content: ReactNode;
54
+ readonly label: string;
55
+ readonly open: boolean;
56
+ };
57
+ }
58
+ /** Required host copy, so branding and language never fall back to another product's values. */
59
+ export interface AdminShellLabels {
60
+ readonly navigation: string;
61
+ readonly openNavigation: string;
62
+ readonly closeNavigation: string;
63
+ readonly skipToContent: string;
64
+ readonly loading: string;
65
+ readonly sessionError: string;
66
+ readonly retry: string;
67
+ readonly expandSidebar: string;
68
+ readonly collapseSidebar: string;
69
+ readonly soon: string;
70
+ }
71
+ export interface AdminShellProps extends AdminShellContext {
72
+ readonly theme?: AdminTheme;
73
+ /** Controlled when supplied; otherwise the injected store restores the user's choice. */
74
+ readonly colorScheme?: ColorSchemePreference;
75
+ readonly themeEnvironment?: AdminThemeEnvironment;
76
+ readonly themePreferenceStore?: AdminThemePreferenceStorePort;
77
+ readonly onColorSchemeChange?: (args: {
78
+ readonly preference: ColorSchemePreference;
79
+ }) => void;
80
+ readonly adminBase: string;
81
+ readonly defaultPanelId: string;
82
+ readonly railStorageKey: string;
83
+ readonly title: ReactNode;
84
+ readonly session: AdminShellSessionPort;
85
+ readonly navigation: AdminShellNavigationPort;
86
+ readonly panels: readonly AdminShellPanel[];
87
+ readonly slots: AdminShellSlots;
88
+ readonly labels: AdminShellLabels;
89
+ readonly capabilities?: readonly string[];
90
+ readonly railDefaultCollapsed?: boolean;
91
+ readonly collapsibleGroups?: readonly string[];
92
+ readonly translateNav?: (args: {
93
+ readonly groups: readonly AdminNavGroup[];
94
+ }) => readonly AdminNavGroup[];
95
+ /** Optional page-driver/measurement seam; the host owns any agent or screenshot integration. */
96
+ readonly mainRef?: Ref<HTMLElement>;
97
+ readonly className?: string;
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,13 @@
1
+ import type { AdminShellContext, AdminShellSessionController, AdminShellSessionPort } from './types.js';
2
+ interface Owner {
3
+ readonly context: AdminShellContext;
4
+ readonly port: AdminShellSessionPort;
5
+ }
6
+ /**
7
+ * Own session reads and invalidation without any host API imports.
8
+ * @param args Stable context and session port. Changing either starts a new session check.
9
+ * @returns Gate state plus refresh/logout actions; adapter failures become an error state.
10
+ */
11
+ export declare function useAdminShellSession(args: Owner): AdminShellSessionController;
12
+ export {};
13
+ //# sourceMappingURL=use-admin-shell-session.d.ts.map